2012-11-18 40 views
1

我是Java初學者,試圖讓它在Eclipse中工作。然而,readLine是通過並通知說,它已被棄用。代碼的作品,雖然不是while ((var2 = var5.readLine()) != null) {位...所以我想知道如何解決它。不贊成readLine()要更改什麼?

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"); 
     } 
    } 
} 
+0

爲什麼一個功能已被廢棄和可能的選擇都記錄你應該把'@ deprecated'標記嚴重的是,在許多情況下的理由在Javadoc。在[DataInputStream文檔]中也是這種情況(http://docs.oracle.com/javase/1.5.0/docs/api/java/io/DataInputStream.html#readLine%28%29) – fvu

回答

6
  • 給你的變量有意義的名稱。
  • 在儘可能小的範圍內聲明變量。
  • 不要將虛擬值(如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); 
    ... 
    } 
} 
+0

當然我會整理這些建議。它原來反編譯的代碼,來自之前的Minecraft版本,其中一個mod不再由原始開發人員更新,我用它來改進最後一個版本中的某些功能。現在我的世界已經更新了我剛剛將所有舊代碼重新插入新源代碼。所以從來沒有原始的源或變量名稱開始。想想這次我會開始更好地命名一些東西。 – NestedCodeblocksFTW

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,您可以用finally條款使用try-with-resources結構分配。)

+0

謝謝,我認爲這是有效的。我說這是因爲即使它編譯並似乎工作..我測試的http服務器已經下降了..所以它不上傳任何東西,當然我沒有得到任何數據響應。但希望能得到適當的測試以後再看。 – NestedCodeblocksFTW

+0

所以我試着用url連接本地主機,但是它沒有按照我的希望工作。我已經放入了我正在使用的全部源代碼(應該是第一次完成的),現在您可以更好地瞭解代碼的功能。 – NestedCodeblocksFTW

相關問題