【问题标题】:deprecated readLine() What to change?不推荐使用 readLine() 要更改什么?
【发布时间】:2012-11-18 22:52:46
【问题描述】:

我是一名 Java 初学者,试图让它在 Eclipse 中工作。但是,readLine 被删除并且通知说它已被弃用。该代码有效,尽管不是 while ((var2 = var5.readLine()) != null) { 位......所以我想知道如何修复它。

final class ScreenShotHelper$1 implements Runnable
{
    public void run()
    {
        try
        {
            String var1 = ScreenShotHelper.access$000().getAbsolutePath();
            String var2 = "";
            HttpURLConnection var3 = null;
            DataOutputStream var4 = null;
            DataInputStream var5 = null;
            String var6 = "\r\n";
            String var7 = "--";
            String var8 = "*****";
            String var9 = "";
            int var10 = 1048576;
            String var11 = "";
            var9 = Minecraft.getMinecraft().thePlayer.username;
            String var12 = "http://localhost/screenupload/index.php?playername=" + var9;
            try
            {
                FileInputStream var13 = new FileInputStream(new File(var1));
                URL var14 = new URL(var12);
                var3 = (HttpURLConnection)var14.openConnection();
                var3.setDoInput(true);
                var3.setDoOutput(true);
                var3.setUseCaches(false);
                var3.setRequestMethod("POST");
                var3.setRequestProperty("Connection", "Keep-Alive");
                var3.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + var8);
                var4 = new DataOutputStream(var3.getOutputStream());
                var4.writeBytes(var7 + var8 + var6);
                var4.writeBytes("Content-Disposition: form-data; name=\"file\";filename=\"" + var1 + "\"" + var6);
                var4.writeBytes(var6);
                int var15 = var13.available();
                int var16 = Math.min(var15, var10);
                byte[] var17 = new byte[var16];

                for (int var18 = var13.read(var17, 0, var16); var18 > 0; var18 = var13.read(var17, 0, var16))
                {
                    var4.write(var17, 0, var16);
                    var15 = var13.available();
                    var16 = Math.min(var15, var10);
                }
                var4.writeBytes(var6);
                var4.writeBytes(var7 + var8 + var7 + var6);
                System.out.println("File is written");
                var13.close();
                var4.flush();
                var4.close();
            }
            catch (MalformedURLException var20)
            {
                System.out.println("error1: " + var20.getMessage());
            }
            catch (IOException var21)
            {
                System.out.println("error2: " + var21.getMessage());
            }

            try
            {
                var5 = new DataInputStream(var3.getInputStream());

                while ((var2 = var5.readLine()) != null) {
                    System.out.println("Server Response " + var2);
                    ScreenShotHelper.mc.thePlayer.addChatMessage("\u00a7aSuccessfully uploaded screenshot!  Direct link:");
                    ScreenShotHelper.mc.thePlayer.addChatMessage("\u00a7a" + var2);
                }
                var5.close();
            }
            catch (IOException var19)
            {
                System.out.println("error3: " + var19.getMessage());
            }
        }
        catch (Exception var22)
        {
            var22.printStackTrace();
            ScreenShotHelper.mc.thePlayer.addChatMessage("\u00a74failed to save");
        }
    }
}

【问题讨论】:

  • 您应该认真对待@deprecated 标记,并且在许多情况下,函数被弃用的原因和可能的替代方案都记录在 Javadoc 中。 doc of DataInputStream中也是如此

标签: java httpurlconnection datainputstream


【解决方案1】:
  • 给变量起有意义的名字。
  • 在尽可能小的范围内声明变量。
  • 不要将虚拟值(如null"")分配给变量。
  • 避免测试中的副作用。
  • 使用自动资源管理完全确保流已关闭。
  • 在将字节转换为字符时确定并使用正确的字符编码。

以下是应用这些要点的代码示例:

try (InputStream is = connection.getInputStream()) {
  BufferedReader lines = new BufferedReader(new InputStreamReader(is, "UTF-8"));
  while (true) {
    String line = lines.readLine();
    if (line == null)
      break;
    System.out.println("Server Response " + line);
    ...
  }
}

【讨论】:

  • 当然,我会根据这些建议进行整理。它最初是从以前的 Minecraft 版本中反编译的代码,带有一个不再由原始开发人员更新的 mod,我用它来改进上一个版本中的一些功能。现在我的世界已经更新我刚刚将所有旧代码重新插入新源。所以从来没有原始的源或变量名开始。我想这次我会开始更好地命名东西。
【解决方案2】:

改用此代码:

BufferedReader var5 = null;
try
{
    var5 = new BufferedReader(new InputStreamReader(var3.getInputStream()));
    // or perhaps
    // new BufferedReader(new InputStreamReader(var3.getInputStream(), "UTF-8"));
    while ((var2 = var5.readLine()) != null) {
        System.out.println("Server Response " + var2);
        ScreenShotHelper.mc.thePlayer.addChatMessage("\u00a7aSuccessfully uploaded screenshot!  Direct link:");
        ScreenShotHelper.mc.thePlayer.addChatMessage("\u00a7a" + var2);
    }

} finally {
    if (var5 != null) {
        try { var5.close(); }
        catch (IOException ignored) {}
    }
}

原因(和建议)可以在docs for DataInputStream.readLine()找到:

此方法不能正确地将字节转换为字符。从 JDK 1.1 开始,读取文本行的首选方法是通过 BufferedReader.readLine() 方法。

(如果您使用的是 Java 7,则可以通过使用 try-with-resources 构造来省去 finally 子句。)

【讨论】:

  • 谢谢,我认为这行得通..我说是因为即使它编译并且似乎工作..我正在测试的http服务器刚刚关闭..所以它没有上传任何东西当然,我没有得到任何数据响应。但希望以后能得到适当的测试。
  • 所以我用 url 连接 localhost 尝试了它,但是它没有像我希望的那样工作。我已经输入了我正在使用的完整源代码(应该第一次这样做),所以现在您可以更好地了解代码的作用。
猜你喜欢
  • 1970-01-01
  • 2011-08-02
  • 2012-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-23
  • 2017-11-04
相关资源
最近更新 更多