main(String[] args)中args[0]为目标语言代码,args[1]起为原文;需用String.join(" ", Arrays.copyOfRange(args, 1, args.length))合并剩余参数,并校验args.length≥2。

怎么用 main(String[] args) 接收翻译目标语言和原文
命令行参数本质就是字符串数组,args[0] 通常是目标语言代码(如 zh、en),args[1] 是待翻译文本。别指望自动解析空格分隔的长句——如果用户输 java Translator zh hello world,args[1] 只是 hello,world 会变成 args[2],直接拼接会出错。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 用
String.join(" ", Arrays.copyOfRange(args, 1, args.length))合并剩余参数,避免漏词 - 至少检查
args.length ,缺参数就打印用法(如 <code>Usage: java Translator <lang> <text>)并System.exit(1) - 语言码建议硬编码白名单(
Set.of("zh", "en", "ja", "ko")),防止传入无效值导致 API 返回 400
怎么调用免费翻译 API(比如 DeepL 或 Google Translate 的公开端点)
没有真正“免费无限制”的官方 Java SDK;多数人实际用的是 HTTP 请求 + JSON 解析。DeepL 的 /v2/translate 需要 API key,而 Google 的 /translate_a/single 虽然没 key 也能发请求,但容易被限流或返回验证码页面——这不是代码问题,是反爬策略。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 优先选带明确免费配额的 API,比如 DeepL 的试用 key(注册即得
1000次/月),把 key 存在环境变量里:System.getenv("DEEPL_API_KEY") - 用
HttpURLConnection就够用,别上OkHttp或Apache HttpClient增加依赖;设置setRequestProperty("Content-Type", "application/x-www-form-urlencoded") - POST body 拼成
text=xxx&target_lang=zh&source_lang=en,注意 URL 编码:用URLEncoder.encode(text, StandardCharsets.UTF_8) - 响应是 JSON,别手写解析器;用
javax.json(JDK 11+ 自带)或最简org.json(一行new JSONObject(responseBody).getJSONArray("translations").getJSONObject(0).getString("text"))
中文乱码、特殊符号崩溃、超时卡死这些怎么防
命令行默认编码不统一:Windows 的 cmd 是 GBK,macOS/Linux 终端多是 UTF-8;API 返回的 JSON 如果含中文,没指定 charset 容易变 ???;网络请求没设超时,一次失败就卡住整个程序。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 读取
args不用处理编码——JVM 启动时已按终端编码解码;但发请求前必须对text做URLEncoder.encode(..., UTF_8) - HTTP 响应流读取时,显式指定
InputStreamReader(in, StandardCharsets.UTF_8),否则BufferedReader用平台默认编码,中文直接报废 - 必须设连接和读取超时:
conn.setConnectTimeout(5000)、conn.setReadTimeout(10000) - 捕获
IOException和JSONException(或JsonException),输出具体错误(如"HTTP 429: too many requests"),而不是只打e.printStackTrace()
为什么不用 ProcessBuilder 调系统自带翻译命令(比如 trans)
因为不可控:trans 是第三方 CLI 工具,不是 Java 标准库;用户没装它,程序就抛 IOException: Cannot run program "trans";它自己可能依赖 Python 或 Node.js 运行时;不同版本输出格式还可能变,JSON 解析逻辑随时崩。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 除非明确要求“复用已有命令行工具”,否则直接走 HTTP 更可靠
- 如果真要用
ProcessBuilder,务必先new ProcessBuilder("which", "trans").start()检查是否存在,再执行主命令 - 别忽略
process.waitFor()的返回值——非零退出码意味着翻译失败,但 Java 不会自动抛异常










