From 3363b1d9c0e6911058bd86970c622bf207401cc5 Mon Sep 17 00:00:00 2001 From: Peter Osterlund Date: Sat, 25 May 2019 09:05:57 +0200 Subject: [PATCH] Use try-with-resources --- .../src/main/java/chess/Book.java | 4 +- .../src/main/java/chess/Evaluate.java | 6 +- .../java/org/petero/droidfish/DroidFish.java | 55 +++++-------- .../java/org/petero/droidfish/FileUtil.java | 37 ++++----- .../org/petero/droidfish/ObjectCache.java | 10 +-- .../java/org/petero/droidfish/PieceSet.java | 4 +- .../BufferedRandomAccessFileReader.java | 6 +- .../petero/droidfish/activities/FENFile.java | 6 +- .../petero/droidfish/activities/PGNFile.java | 42 +++++----- .../org/petero/droidfish/book/CtgBook.java | 14 +--- .../java/org/petero/droidfish/book/EcoDb.java | 6 +- .../petero/droidfish/book/PolyglotBook.java | 6 +- .../petero/droidfish/engine/EngineUtil.java | 6 +- .../droidfish/engine/ExternalEngine.java | 13 +--- .../droidfish/engine/InternalStockFish.java | 34 +++----- .../droidfish/engine/UCIEngineBase.java | 14 +--- .../gamelogic/DroidChessController.java | 24 +----- .../org/petero/droidfish/gamelogic/Game.java | 2 +- buildSrc/src/main/java/chess/Book.java | 24 +++--- buildSrc/src/main/java/chess/EcoBuilder.java | 77 +++++++++---------- buildSrc/src/main/java/chess/FileUtil.java | 14 ++-- 21 files changed, 146 insertions(+), 258 deletions(-) diff --git a/CuckooChessEngine/src/main/java/chess/Book.java b/CuckooChessEngine/src/main/java/chess/Book.java index 9782b1f..dbfbc2e 100644 --- a/CuckooChessEngine/src/main/java/chess/Book.java +++ b/CuckooChessEngine/src/main/java/chess/Book.java @@ -54,8 +54,7 @@ public class Book { rndGen = new SecureRandom(); rndGen.setSeed(System.currentTimeMillis()); numBookMoves = 0; - try { - InputStream inStream = getClass().getResourceAsStream("/book.bin"); + try (InputStream inStream = getClass().getResourceAsStream("/book.bin")) { List buf = new ArrayList<>(8192); byte[] tmpBuf = new byte[1024]; while (true) { @@ -64,7 +63,6 @@ public class Book { for (int i = 0; i < len; i++) buf.add(tmpBuf[i]); } - inStream.close(); Position startPos = TextIO.readFEN(TextIO.startPosFEN); Position pos = new Position(startPos); UndoInfo ui = new UndoInfo(); diff --git a/CuckooChessEngine/src/main/java/chess/Evaluate.java b/CuckooChessEngine/src/main/java/chess/Evaluate.java index 8db0e07..6cb7a9f 100644 --- a/CuckooChessEngine/src/main/java/chess/Evaluate.java +++ b/CuckooChessEngine/src/main/java/chess/Evaluate.java @@ -236,8 +236,7 @@ public class Evaluate { private byte[] readTable(String resource, int length) { byte[] table = new byte[2*32*64*48/8]; - InputStream inStream = getClass().getResourceAsStream(resource); - try { + try (InputStream inStream = getClass().getResourceAsStream(resource)) { int off = 0; while (off < table.length) { int len = inStream.read(table, off, table.length - off); @@ -245,10 +244,9 @@ public class Evaluate { throw new RuntimeException(); off += len; } - inStream.close(); return table; } catch (IOException e) { - throw new RuntimeException(); + throw new RuntimeException(e); } } diff --git a/DroidFishApp/src/main/java/org/petero/droidfish/DroidFish.java b/DroidFishApp/src/main/java/org/petero/droidfish/DroidFish.java index 27d9124..f76e8cb 100644 --- a/DroidFishApp/src/main/java/org/petero/droidfish/DroidFish.java +++ b/DroidFishApp/src/main/java/org/petero/droidfish/DroidFish.java @@ -790,14 +790,11 @@ public class DroidFish extends Activity if ((filename == null) && ("content".equals(scheme) || "file".equals(scheme))) { ContentResolver resolver = getContentResolver(); - InputStream in = resolver.openInputStream(data); String sep = File.separator; String fn = Environment.getExternalStorageDirectory() + sep + pgnDir + sep + ".sharedfile.pgn"; - try { + try (InputStream in = resolver.openInputStream(data)) { FileUtil.writeFile(in, fn); - } finally { - in.close(); } PGNFile pgnFile = new PGNFile(fn); long fileLen = FileUtil.getFileLength(fn); @@ -805,11 +802,8 @@ public class DroidFish extends Activity if ((fileLen > 1024 * 1024) || (gi.first == GameInfoResult.OK && gi.second.size() > 1)) { filename = fn; } else { - in = new FileInputStream(fn); - try { + try (FileInputStream in = new FileInputStream(fn)) { pgnOrFen = FileUtil.readFromStream(in); - } finally { - in.close(); } } } @@ -2394,14 +2388,9 @@ public class DroidFish extends Activity File dir = new File(getFilesDir(), "shared"); dir.mkdirs(); File file = new File(dir, game ? "game.pgn" : "game.txt"); - try { - FileOutputStream fos = new FileOutputStream(file); - OutputStreamWriter ow = new OutputStreamWriter(fos, "UTF-8"); - try { - ow.write(pgn); - } finally { - ow.close(); - } + try (FileOutputStream fos = new FileOutputStream(file); + OutputStreamWriter ow = new OutputStreamWriter(fos, "UTF-8")) { + ow.write(pgn); } catch (IOException e) { DroidFishApp.toast(e.getMessage(), Toast.LENGTH_LONG); return; @@ -2427,13 +2416,8 @@ public class DroidFish extends Activity imgDir.mkdirs(); File file = new File(imgDir, "screenshot.png"); try { - OutputStream os = null; - try { - os = new FileOutputStream(file); + try (OutputStream os = new FileOutputStream(file)) { b.compress(Bitmap.CompressFormat.PNG, 100, os); - } finally { - if (os != null) - os.close(); } } catch (IOException e) { DroidFishApp.toast(e.getMessage(), Toast.LENGTH_LONG); @@ -2521,15 +2505,16 @@ public class DroidFish extends Activity private Dialog aboutDialog() { AlertDialog.Builder builder = new AlertDialog.Builder(this); - String title = getString(R.string.app_name); WebView wv = new WebView(this); builder.setView(wv); - InputStream is = getResources().openRawResource(R.raw.about); - String data = FileUtil.readFromStream(is); - if (data == null) - data = ""; - try { is.close(); } catch (IOException ignore) {} - wv.loadDataWithBaseURL(null, data, "text/html", "utf-8", null); + try (InputStream is = getResources().openRawResource(R.raw.about)) { + String data = FileUtil.readFromStream(is); + if (data == null) + data = ""; + wv.loadDataWithBaseURL(null, data, "text/html", "utf-8", null); + } catch (IOException ignore) { + } + String title = getString(R.string.app_name); try { PackageInfo pi = getPackageManager().getPackageInfo("org.petero.droidfish", 0); title += " " + pi.versionName; @@ -2577,7 +2562,7 @@ public class DroidFish extends Activity else if (item == numFiles + 2) bookFile = "nobook:"; else - bookFile = items[item].toString(); + bookFile = items[item]; editor.putString("bookFile", bookFile); editor.apply(); bookOptions.filename = bookFile; @@ -2664,12 +2649,12 @@ public class DroidFish extends Activity private Dialog selectPgnFileDialog() { return selectFileDialog(pgnDir, R.string.select_pgn_file, R.string.no_pgn_files, - "currentPGNFile", pathName -> loadPGNFromFile(pathName)); + "currentPGNFile", this::loadPGNFromFile); } private Dialog selectFenFileDialog() { return selectFileDialog(fenDir, R.string.select_fen_file, R.string.no_fen_files, - "currentFENFile", pathName -> loadFENFromFile(pathName)); + "currentFENFile", this::loadFENFromFile); } private Dialog selectFileDialog(final String defaultDir, int selectFileMsg, int noFilesMsg, @@ -2696,7 +2681,7 @@ public class DroidFish extends Activity builder.setSingleChoiceItems(fileNames, defaultItem, (dialog, item) -> { dialog.dismiss(); String sep = File.separator; - String fn = fileNames[item].toString(); + String fn = fileNames[item]; String pathName = Environment.getExternalStorageDirectory() + sep + defaultDir + sep + fn; loader.load(pathName); }); @@ -3429,12 +3414,10 @@ public class DroidFish extends Activity final Runnable writeConfig = () -> { String hostName1 = hostNameView.getText().toString(); String port1 = portView.getText().toString(); - try { - FileWriter fw = new FileWriter(new File(networkEngineToConfig), false); + try (FileWriter fw = new FileWriter(new File(networkEngineToConfig), false)) { fw.write("NETE\n"); fw.write(hostName1); fw.write("\n"); fw.write(port1); fw.write("\n"); - fw.close(); setEngineOptions(true); } catch (IOException e) { DroidFishApp.toast(e.getMessage(), Toast.LENGTH_LONG); diff --git a/DroidFishApp/src/main/java/org/petero/droidfish/FileUtil.java b/DroidFishApp/src/main/java/org/petero/droidfish/FileUtil.java index bd80ba5..bff0645 100644 --- a/DroidFishApp/src/main/java/org/petero/droidfish/FileUtil.java +++ b/DroidFishApp/src/main/java/org/petero/droidfish/FileUtil.java @@ -33,29 +33,26 @@ public class FileUtil { /** Read a text file. Return string array with one string per line. */ public static String[] readFile(String filename) throws IOException { ArrayList ret = new ArrayList<>(); - InputStream inStream = new FileInputStream(filename); - InputStreamReader inFile = new InputStreamReader(inStream, "UTF-8"); - BufferedReader inBuf = new BufferedReader(inFile); - String line; - while ((line = inBuf.readLine()) != null) - ret.add(line); - inBuf.close(); - return ret.toArray(new String[0]); + try (InputStream inStream = new FileInputStream(filename); + InputStreamReader inFile = new InputStreamReader(inStream, "UTF-8"); + BufferedReader inBuf = new BufferedReader(inFile)) { + String line; + while ((line = inBuf.readLine()) != null) + ret.add(line); + return ret.toArray(new String[0]); + } } /** Read all data from an input stream. Return null if IO error. */ public static String readFromStream(InputStream is) { - InputStreamReader isr; - try { - isr = new InputStreamReader(is, "UTF-8"); - BufferedReader br = new BufferedReader(isr); + try (InputStreamReader isr = new InputStreamReader(is, "UTF-8"); + BufferedReader br = new BufferedReader(isr)) { StringBuilder sb = new StringBuilder(); String line; while ((line = br.readLine()) != null) { sb.append(line); sb.append('\n'); } - br.close(); return sb.toString(); } catch (UnsupportedEncodingException e) { return null; @@ -66,8 +63,7 @@ public class FileUtil { /** Read data from input stream and write to file. */ public static void writeFile(InputStream is, String outFile) throws IOException { - OutputStream os = new FileOutputStream(outFile); - try { + try (OutputStream os = new FileOutputStream(outFile)) { byte[] buffer = new byte[16384]; while (true) { int len = is.read(buffer); @@ -75,20 +71,13 @@ public class FileUtil { break; os.write(buffer, 0, len); } - } finally { - os.close(); } } /** Return the length of a file, or -1 if length can not be determined. */ public static long getFileLength(String filename) { - try { - RandomAccessFile raf = new RandomAccessFile(filename, "r"); - try { - return raf.length(); - } finally { - raf.close(); - } + try (RandomAccessFile raf = new RandomAccessFile(filename, "r")) { + return raf.length(); } catch (IOException ex) { return -1; } diff --git a/DroidFishApp/src/main/java/org/petero/droidfish/ObjectCache.java b/DroidFishApp/src/main/java/org/petero/droidfish/ObjectCache.java index 6549699..41ddd4e 100644 --- a/DroidFishApp/src/main/java/org/petero/droidfish/ObjectCache.java +++ b/DroidFishApp/src/main/java/org/petero/droidfish/ObjectCache.java @@ -130,12 +130,9 @@ public class ObjectCache { token++; File f = new File(dir, String.valueOf(token)); if (f.createNewFile()) { - FileOutputStream fos = new FileOutputStream(f); - try { + try (FileOutputStream fos = new FileOutputStream(f)) { fos.write(b); return token; - } finally { - fos.close(); } } } @@ -152,8 +149,7 @@ public class ObjectCache { if (dir.exists()) { File f = new File(dir, String.valueOf(token)); try { - RandomAccessFile raf = new RandomAccessFile(f, "r"); - try { + try (RandomAccessFile raf = new RandomAccessFile(f, "r")) { int len = (int)raf.length(); byte[] buf = new byte[len]; int offs = 0; @@ -164,8 +160,6 @@ public class ObjectCache { offs += l; } return buf; - } finally { - raf.close(); } } catch (IOException ignore) { } diff --git a/DroidFishApp/src/main/java/org/petero/droidfish/PieceSet.java b/DroidFishApp/src/main/java/org/petero/droidfish/PieceSet.java index d1c488d..4962b7e 100644 --- a/DroidFishApp/src/main/java/org/petero/droidfish/PieceSet.java +++ b/DroidFishApp/src/main/java/org/petero/droidfish/PieceSet.java @@ -106,8 +106,7 @@ public class PieceSet { } private void parseSvgData() { - try { - ZipInputStream zis = getZipStream(); + try (ZipInputStream zis = getZipStream()) { ZipEntry entry; while ((entry = zis.getNextEntry()) != null) { if (!entry.isDirectory()) { @@ -129,7 +128,6 @@ public class PieceSet { } zis.closeEntry(); } - zis.close(); } catch (IOException ex) { throw new RuntimeException("Cannot read chess pieces data", ex); } diff --git a/DroidFishApp/src/main/java/org/petero/droidfish/activities/BufferedRandomAccessFileReader.java b/DroidFishApp/src/main/java/org/petero/droidfish/activities/BufferedRandomAccessFileReader.java index cf2140a..07ebd6d 100644 --- a/DroidFishApp/src/main/java/org/petero/droidfish/activities/BufferedRandomAccessFileReader.java +++ b/DroidFishApp/src/main/java/org/petero/droidfish/activities/BufferedRandomAccessFileReader.java @@ -17,11 +17,12 @@ */ package org.petero.droidfish.activities; +import java.io.Closeable; import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; -final class BufferedRandomAccessFileReader { +final class BufferedRandomAccessFileReader implements Closeable { private RandomAccessFile f; private byte[] buffer = new byte[8192]; private long bufStartFilePos = 0; @@ -37,7 +38,8 @@ final class BufferedRandomAccessFileReader { final long getFilePointer() { return bufStartFilePos + bufPos; } - final void close() throws IOException { + @Override + public void close() throws IOException { f.close(); } diff --git a/DroidFishApp/src/main/java/org/petero/droidfish/activities/FENFile.java b/DroidFishApp/src/main/java/org/petero/droidfish/activities/FENFile.java index 6106ec0..8d7c8d7 100644 --- a/DroidFishApp/src/main/java/org/petero/droidfish/activities/FENFile.java +++ b/DroidFishApp/src/main/java/org/petero/droidfish/activities/FENFile.java @@ -66,10 +66,9 @@ public class FENFile { public final Pair> getFenInfo(Activity activity, final ProgressDialog progress) { ArrayList fensInFile = new ArrayList<>(); - try { + try (BufferedRandomAccessFileReader f = + new BufferedRandomAccessFileReader(fileName.getAbsolutePath())) { int percent = -1; - fensInFile.clear(); - BufferedRandomAccessFileReader f = new BufferedRandomAccessFileReader(fileName.getAbsolutePath()); long fileLen = f.length(); long filePos = 0; int fenNo = 1; @@ -92,7 +91,6 @@ public class FENFile { if (Thread.currentThread().isInterrupted()) return new Pair<>(FenInfoResult.CANCEL, null); } - f.close(); } catch (IOException ignore) { } catch (OutOfMemoryError e) { fensInFile.clear(); diff --git a/DroidFishApp/src/main/java/org/petero/droidfish/activities/PGNFile.java b/DroidFishApp/src/main/java/org/petero/droidfish/activities/PGNFile.java index 5691403..58566d3 100644 --- a/DroidFishApp/src/main/java/org/petero/droidfish/activities/PGNFile.java +++ b/DroidFishApp/src/main/java/org/petero/droidfish/activities/PGNFile.java @@ -18,6 +18,7 @@ package org.petero.droidfish.activities; +import java.io.Closeable; import java.io.File; import java.io.FileInputStream; import java.io.FileWriter; @@ -133,7 +134,7 @@ public class PGNFile { } } - private static class BufferedInput { + private static class BufferedInput implements Closeable { private byte buf[] = new byte[8192]; private int bufLen = 0; private int pos = 0; @@ -151,6 +152,7 @@ public class PGNFile { } return buf[pos++] & 0xff; } + @Override public void close() { try { is.close(); @@ -382,12 +384,10 @@ public class PGNFile { /** Read one game defined by gi. Return null on failure. */ final String readOneGame(GameInfo gi) { - try { - RandomAccessFile f = new RandomAccessFile(fileName, "r"); + try (RandomAccessFile f = new RandomAccessFile(fileName, "r")) { byte[] pgnData = new byte[(int) (gi.endPos - gi.startPos)]; f.seek(gi.startPos); f.readFully(pgnData); - f.close(); return new String(pgnData); } catch (IOException ignore) { } @@ -396,11 +396,9 @@ public class PGNFile { /** Append PGN to the end of this PGN file. */ public final void appendPGN(String pgn) { - try { - mkDirs(); - FileWriter fw = new FileWriter(fileName, true); + mkDirs(); + try (FileWriter fw = new FileWriter(fileName, true)) { fw.write(pgn); - fw.close(); DroidFishApp.toast(R.string.game_saved, Toast.LENGTH_SHORT); } catch (IOException e) { DroidFishApp.toast(R.string.failed_to_save_game, Toast.LENGTH_SHORT); @@ -410,13 +408,12 @@ public class PGNFile { final boolean deleteGame(GameInfo gi, ArrayList gamesInFile) { try { File tmpFile = new File(fileName + ".tmp_delete"); - RandomAccessFile fileReader = new RandomAccessFile(fileName, "r"); - RandomAccessFile fileWriter = new RandomAccessFile(tmpFile, "rw"); - copyData(fileReader, fileWriter, gi.startPos); - fileReader.seek(gi.endPos); - copyData(fileReader, fileWriter, fileReader.length() - gi.endPos); - fileReader.close(); - fileWriter.close(); + try (RandomAccessFile fileReader = new RandomAccessFile(fileName, "r"); + RandomAccessFile fileWriter = new RandomAccessFile(tmpFile, "rw")) { + copyData(fileReader, fileWriter, gi.startPos); + fileReader.seek(gi.endPos); + copyData(fileReader, fileWriter, fileReader.length() - gi.endPos); + } if (!tmpFile.renameTo(fileName)) throw new IOException(); @@ -443,14 +440,13 @@ public class PGNFile { final void replacePGN(String pgnToSave, GameInfo gi) { try { File tmpFile = new File(fileName + ".tmp_delete"); - RandomAccessFile fileReader = new RandomAccessFile(fileName, "r"); - RandomAccessFile fileWriter = new RandomAccessFile(tmpFile, "rw"); - copyData(fileReader, fileWriter, gi.startPos); - fileWriter.write(pgnToSave.getBytes()); - fileReader.seek(gi.endPos); - copyData(fileReader, fileWriter, fileReader.length() - gi.endPos); - fileReader.close(); - fileWriter.close(); + try (RandomAccessFile fileReader = new RandomAccessFile(fileName, "r"); + RandomAccessFile fileWriter = new RandomAccessFile(tmpFile, "rw")) { + copyData(fileReader, fileWriter, gi.startPos); + fileWriter.write(pgnToSave.getBytes()); + fileReader.seek(gi.endPos); + copyData(fileReader, fileWriter, fileReader.length() - gi.endPos); + } if (!tmpFile.renameTo(fileName)) throw new IOException(); DroidFishApp.toast(R.string.game_saved, Toast.LENGTH_SHORT); diff --git a/DroidFishApp/src/main/java/org/petero/droidfish/book/CtgBook.java b/DroidFishApp/src/main/java/org/petero/droidfish/book/CtgBook.java index 379b2f3..e3ff36c 100644 --- a/DroidFishApp/src/main/java/org/petero/droidfish/book/CtgBook.java +++ b/DroidFishApp/src/main/java/org/petero/droidfish/book/CtgBook.java @@ -63,13 +63,9 @@ class CtgBook implements IOpeningBook { @Override public ArrayList getBookEntries(Position pos) { - RandomAccessFile ctgF = null; - RandomAccessFile ctbF = null; - RandomAccessFile ctoF = null; - try { - ctgF = new RandomAccessFile(ctgFile, "r"); - ctbF = new RandomAccessFile(ctbFile, "r"); - ctoF = new RandomAccessFile(ctoFile, "r"); + try (RandomAccessFile ctgF = new RandomAccessFile(ctgFile, "r"); + RandomAccessFile ctbF = new RandomAccessFile(ctbFile, "r"); + RandomAccessFile ctoF = new RandomAccessFile(ctoFile, "r")) { CtbFile ctb = new CtbFile(ctbF); CtoFile cto = new CtoFile(ctoF); @@ -119,10 +115,6 @@ class CtgBook implements IOpeningBook { return ret; } catch (IOException e) { return null; - } finally { - if (ctgF != null) try { ctgF.close(); } catch (IOException ignore) { } - if (ctbF != null) try { ctbF.close(); } catch (IOException ignore) { } - if (ctoF != null) try { ctoF.close(); } catch (IOException ignore) { } } } diff --git a/DroidFishApp/src/main/java/org/petero/droidfish/book/EcoDb.java b/DroidFishApp/src/main/java/org/petero/droidfish/book/EcoDb.java index 5d08753..f9ddb6c 100644 --- a/DroidFishApp/src/main/java/org/petero/droidfish/book/EcoDb.java +++ b/DroidFishApp/src/main/java/org/petero/droidfish/book/EcoDb.java @@ -252,16 +252,14 @@ public class EcoDb { posHashToNodeIdx = new HashMap<>(); posHashToNodeIdx2 = new HashMap<>(); gtNodeToIdx = new WeakLRUCache<>(50); - try { - ByteArrayOutputStream bufStream = new ByteArrayOutputStream(); - InputStream inStream = DroidFishApp.getContext().getAssets().open("eco.dat"); + try (ByteArrayOutputStream bufStream = new ByteArrayOutputStream(); + InputStream inStream = DroidFishApp.getContext().getAssets().open("eco.dat")) { byte[] buf = new byte[1024]; while (true) { int len = inStream.read(buf); if (len <= 0) break; bufStream.write(buf, 0, len); } - inStream.close(); bufStream.flush(); buf = bufStream.toByteArray(); int nNodes = 0; diff --git a/DroidFishApp/src/main/java/org/petero/droidfish/book/PolyglotBook.java b/DroidFishApp/src/main/java/org/petero/droidfish/book/PolyglotBook.java index e48650c..b8c321c 100644 --- a/DroidFishApp/src/main/java/org/petero/droidfish/book/PolyglotBook.java +++ b/DroidFishApp/src/main/java/org/petero/droidfish/book/PolyglotBook.java @@ -372,8 +372,7 @@ class PolyglotBook implements IOpeningBook { @Override public final ArrayList getBookEntries(Position pos) { - try { - RandomAccessFile f = new RandomAccessFile(bookFile, "r"); + try (RandomAccessFile f = new RandomAccessFile(bookFile, "r")) { long numEntries = f.length() / 16; long key = getHashKey(pos); PGBookEntry ent = new PGBookEntry(); @@ -406,10 +405,7 @@ class PolyglotBook implements IOpeningBook { ret.add(be); entNo++; } - f.close(); return ret; - } catch (FileNotFoundException e) { - return null; } catch (IOException e) { return null; } diff --git a/DroidFishApp/src/main/java/org/petero/droidfish/engine/EngineUtil.java b/DroidFishApp/src/main/java/org/petero/droidfish/engine/EngineUtil.java index 7a63d43..4fd04b4 100644 --- a/DroidFishApp/src/main/java/org/petero/droidfish/engine/EngineUtil.java +++ b/DroidFishApp/src/main/java/org/petero/droidfish/engine/EngineUtil.java @@ -47,13 +47,11 @@ public class EngineUtil { /** Return true if file "engine" is a network engine. */ public static boolean isNetEngine(String engine) { boolean netEngine = false; - try { - InputStream inStream = new FileInputStream(engine); - InputStreamReader inFile = new InputStreamReader(inStream); + try (InputStream inStream = new FileInputStream(engine); + InputStreamReader inFile = new InputStreamReader(inStream)) { char[] buf = new char[4]; if ((inFile.read(buf) == 4) && "NETE".equals(new String(buf))) netEngine = true; - inFile.close(); } catch (IOException ignore) { } return netEngine; diff --git a/DroidFishApp/src/main/java/org/petero/droidfish/engine/ExternalEngine.java b/DroidFishApp/src/main/java/org/petero/droidfish/engine/ExternalEngine.java index cb6ba54..0614e1e 100644 --- a/DroidFishApp/src/main/java/org/petero/droidfish/engine/ExternalEngine.java +++ b/DroidFishApp/src/main/java/org/petero/droidfish/engine/ExternalEngine.java @@ -302,19 +302,14 @@ public class ExternalEngine extends UCIEngineBase { if (to.exists()) to.delete(); to.createNewFile(); - FileInputStream fis = null; - FileOutputStream fos = null; - try { - fis = new FileInputStream(from); - FileChannel inFC = fis.getChannel(); - fos = new FileOutputStream(to); - FileChannel outFC = fos.getChannel(); + try (FileInputStream fis = new FileInputStream(from); + FileChannel inFC = fis.getChannel(); + FileOutputStream fos = new FileOutputStream(to); + FileChannel outFC = fos.getChannel()) { long cnt = outFC.transferFrom(inFC, 0, inFC.size()); if (cnt < inFC.size()) throw new IOException("File copy failed"); } finally { - if (fis != null) { try { fis.close(); } catch (IOException ignore) {} } - if (fos != null) { try { fos.close(); } catch (IOException ignore) {} } to.setLastModified(from.lastModified()); } return to.getAbsolutePath(); diff --git a/DroidFishApp/src/main/java/org/petero/droidfish/engine/InternalStockFish.java b/DroidFishApp/src/main/java/org/petero/droidfish/engine/InternalStockFish.java index 1b41427..cd13efa 100644 --- a/DroidFishApp/src/main/java/org/petero/droidfish/engine/InternalStockFish.java +++ b/DroidFishApp/src/main/java/org/petero/droidfish/engine/InternalStockFish.java @@ -63,34 +63,25 @@ public class InternalStockFish extends ExternalEngine { } private long readCheckSum(File f) { - InputStream is = null; - try { - is = new FileInputStream(f); - DataInputStream dis = new DataInputStream(is); + try (InputStream is = new FileInputStream(f); + DataInputStream dis = new DataInputStream(is)) { return dis.readLong(); } catch (IOException e) { return 0; - } finally { - if (is != null) try { is.close(); } catch (IOException ignore) {} } } private void writeCheckSum(File f, long checkSum) { - DataOutputStream dos = null; - try { - OutputStream os = new FileOutputStream(f); - dos = new DataOutputStream(os); + try (OutputStream os = new FileOutputStream(f); + DataOutputStream dos = new DataOutputStream(os)) { dos.writeLong(checkSum); - } catch (IOException e) { - } finally { - if (dos != null) try { dos.close(); } catch (IOException ignore) {} + } catch (IOException ignore) { } } private long computeAssetsCheckSum(String sfExe) { - InputStream is = null; - try { - is = context.getAssets().open(sfExe); + + try (InputStream is = context.getAssets().open(sfExe)) { MessageDigest md = MessageDigest.getInstance("SHA-1"); byte[] buf = new byte[8192]; while (true) { @@ -109,8 +100,6 @@ public class InternalStockFish extends ExternalEngine { return -1; } catch (NoSuchAlgorithmException e) { return -1; - } finally { - if (is != null) try { is.close(); } catch (IOException ignore) {} } } @@ -130,10 +119,8 @@ public class InternalStockFish extends ExternalEngine { to.delete(); to.createNewFile(); - InputStream is = context.getAssets().open(sfExe); - OutputStream os = new FileOutputStream(to); - - try { + try (InputStream is = context.getAssets().open(sfExe); + OutputStream os = new FileOutputStream(to)) { byte[] buf = new byte[8192]; while (true) { int len = is.read(buf); @@ -141,9 +128,6 @@ public class InternalStockFish extends ExternalEngine { break; os.write(buf, 0, len); } - } finally { - if (is != null) try { is.close(); } catch (IOException ignore) {} - if (os != null) try { os.close(); } catch (IOException ignore) {} } writeCheckSum(new File(internalSFPath()), newCSum); diff --git a/DroidFishApp/src/main/java/org/petero/droidfish/engine/UCIEngineBase.java b/DroidFishApp/src/main/java/org/petero/droidfish/engine/UCIEngineBase.java index 14571d1..422b924 100644 --- a/DroidFishApp/src/main/java/org/petero/droidfish/engine/UCIEngineBase.java +++ b/DroidFishApp/src/main/java/org/petero/droidfish/engine/UCIEngineBase.java @@ -76,14 +76,9 @@ public abstract class UCIEngineBase implements UCIEngine { public final void applyIniFile() { File optionsFile = getOptionsFile(); Properties iniOptions = new Properties(); - FileInputStream is = null; - try { - is = new FileInputStream(optionsFile); + try (FileInputStream is = new FileInputStream(optionsFile)) { iniOptions.load(is); } catch (IOException ignore) { - } finally { - if (is != null) - try { is.close(); } catch (IOException ignore) {} } for (Map.Entry ent : iniOptions.entrySet()) { if (ent.getKey() instanceof String && ent.getValue() instanceof String) { @@ -116,14 +111,9 @@ public abstract class UCIEngineBase implements UCIEngine { iniOptions.put(o.name, o.getStringValue()); } File optionsFile = getOptionsFile(); - FileOutputStream os = null; - try { - os = new FileOutputStream(optionsFile); + try (FileOutputStream os = new FileOutputStream(optionsFile)) { iniOptions.store(os, null); } catch (IOException ignore) { - } finally { - if (os != null) - try { os.close(); } catch (IOException ignore) {} } } diff --git a/DroidFishApp/src/main/java/org/petero/droidfish/gamelogic/DroidChessController.java b/DroidFishApp/src/main/java/org/petero/droidfish/gamelogic/DroidChessController.java index d70345f..2c6825e 100644 --- a/DroidFishApp/src/main/java/org/petero/droidfish/gamelogic/DroidChessController.java +++ b/DroidFishApp/src/main/java/org/petero/droidfish/gamelogic/DroidChessController.java @@ -211,40 +211,24 @@ public class DroidChessController { /** De-serialize from byte array. */ public final synchronized void fromByteArray(byte[] data, int version) { - ByteArrayInputStream bais = null; - DataInputStream dis = null; - try { - bais = new ByteArrayInputStream(data); - dis = new DataInputStream(bais); + try (ByteArrayInputStream bais = new ByteArrayInputStream(data); + DataInputStream dis = new DataInputStream(bais)) { game.readFromStream(dis, version); game.tree.translateMoves(); } catch (IOException ignore) { } catch (ChessParseError ignore) { - } finally { - if (dis != null) - try { dis.close(); } catch (IOException ignore) {} - if (bais != null) - try { bais.close(); } catch (IOException ignore) {} } } /** Serialize to byte array. */ public final synchronized byte[] toByteArray() { - ByteArrayOutputStream baos = null; - DataOutputStream dos = null; - try { - baos = new ByteArrayOutputStream(32768); - dos = new DataOutputStream(baos); + try (ByteArrayOutputStream baos = new ByteArrayOutputStream(32768); + DataOutputStream dos = new DataOutputStream(baos)) { game.writeToStream(dos); dos.flush(); return baos.toByteArray(); } catch (IOException e) { return null; - } finally { - if (dos != null) - try { dos.close(); } catch (IOException ignore) {} - if (baos != null) - try { baos.close(); } catch (IOException ignore) {} } } diff --git a/DroidFishApp/src/main/java/org/petero/droidfish/gamelogic/Game.java b/DroidFishApp/src/main/java/org/petero/droidfish/gamelogic/Game.java index c212eac..b26c262 100644 --- a/DroidFishApp/src/main/java/org/petero/droidfish/gamelogic/Game.java +++ b/DroidFishApp/src/main/java/org/petero/droidfish/gamelogic/Game.java @@ -68,7 +68,7 @@ public class Game { } /** Controls behavior when a new move is added to the game.*/ - public static enum AddMoveBehavior { + public enum AddMoveBehavior { /** Add the new move first in the list of variations. */ ADD_FIRST, /** Add the new move last in the list of variations. */ diff --git a/buildSrc/src/main/java/chess/Book.java b/buildSrc/src/main/java/chess/Book.java index 54be7a7..95e2bcf 100644 --- a/buildSrc/src/main/java/chess/Book.java +++ b/buildSrc/src/main/java/chess/Book.java @@ -59,8 +59,7 @@ public class Book { rndGen = new SecureRandom(); rndGen.setSeed(System.currentTimeMillis()); numBookMoves = 0; - try { - InputStream inStream = getClass().getResourceAsStream("/book.bin"); + try (InputStream inStream = getClass().getResourceAsStream("/book.bin")) { List buf = new ArrayList<>(8192); byte[] tmpBuf = new byte[1024]; while (true) { @@ -69,7 +68,6 @@ public class Book { for (int i = 0; i < len; i++) buf.add(tmpBuf[i]); } - inStream.close(); Position startPos = TextIO.readFEN(TextIO.startPosFEN); Position pos = new Position(startPos); UndoInfo ui = new UndoInfo(); @@ -191,22 +189,21 @@ public class Book { } public static void main2(String inFile, String outFile) throws IOException { List binBook = createBinBook(inFile); - FileOutputStream out = new FileOutputStream(outFile); - int bookLen = binBook.size(); - byte[] binBookA = new byte[bookLen]; - for (int i = 0; i < bookLen; i++) - binBookA[i] = binBook.get(i); - out.write(binBookA); - out.close(); + try (FileOutputStream out = new FileOutputStream(outFile)) { + int bookLen = binBook.size(); + byte[] binBookA = new byte[bookLen]; + for (int i = 0; i < bookLen; i++) + binBookA[i] = binBook.get(i); + out.write(binBookA); + } } public static List createBinBook(String inFileName) { List binBook = new ArrayList<>(0); - try { - InputStream inStream = new FileInputStream(inFileName); + try (InputStream inStream = new FileInputStream(inFileName); InputStreamReader inFile = new InputStreamReader(inStream); BufferedReader inBuf = new BufferedReader(inFile); - LineNumberReader lnr = new LineNumberReader(inBuf); + LineNumberReader lnr = new LineNumberReader(inBuf)) { String line; while ((line = lnr.readLine()) != null) { if (line.startsWith("#") || (line.length() == 0)) { @@ -218,7 +215,6 @@ public class Book { } // System.out.printf("no:%d line:%s%n", lnr.getLineNumber(), line); } - lnr.close(); } catch (ChessParseError ex) { throw new RuntimeException(); } catch (IOException ex) { diff --git a/buildSrc/src/main/java/chess/EcoBuilder.java b/buildSrc/src/main/java/chess/EcoBuilder.java index e52136e..290908d 100644 --- a/buildSrc/src/main/java/chess/EcoBuilder.java +++ b/buildSrc/src/main/java/chess/EcoBuilder.java @@ -151,51 +151,50 @@ public class EcoBuilder { /** Write the binary ECO code data file. */ private void writeDataFile(String ecoDatFile) throws Throwable { - FileOutputStream out = new FileOutputStream(ecoDatFile); + try (FileOutputStream out = new FileOutputStream(ecoDatFile)) { - // Write nodes - byte[] buf = new byte[12]; - for (int i = 0; i < nodes.size(); i++) { - Node n = nodes.get(i); - int cm = n.move == null ? 0 : n.move.getCompressedMove(); - buf[0] = (byte)(cm >> 8); // Move, high byte - buf[1] = (byte)(cm & 255); // Move, low byte - buf[2] = (byte)(n.ecoIdx >> 8); // Index, high byte - buf[3] = (byte)(n.ecoIdx & 255); // Index, low byte - buf[4] = (byte)(n.opnIdx >> 8); // Index, high byte - buf[5] = (byte)(n.opnIdx & 255); // Index, low byte - buf[6] = (byte)(n.varIdx >> 8); // Index, high byte - buf[7] = (byte)(n.varIdx & 255); // Index, low byte - int firstChild = -1; - if (n.children.size() > 0) - firstChild = n.children.get(0).index; - buf[8] = (byte)(firstChild >> 8); - buf[9] = (byte)(firstChild & 255); - int nextSibling = -1; - if (n.parent != null) { - ArrayList siblings = n.parent.children; - for (int j = 0; j < siblings.size()-1; j++) { - if (siblings.get(j).move.equals(n.move)) { - nextSibling = siblings.get(j+1).index; - break; + // Write nodes + byte[] buf = new byte[12]; + for (int i = 0; i < nodes.size(); i++) { + Node n = nodes.get(i); + int cm = n.move == null ? 0 : n.move.getCompressedMove(); + buf[0] = (byte)(cm >> 8); // Move, high byte + buf[1] = (byte)(cm & 255); // Move, low byte + buf[2] = (byte)(n.ecoIdx >> 8); // Index, high byte + buf[3] = (byte)(n.ecoIdx & 255); // Index, low byte + buf[4] = (byte)(n.opnIdx >> 8); // Index, high byte + buf[5] = (byte)(n.opnIdx & 255); // Index, low byte + buf[6] = (byte)(n.varIdx >> 8); // Index, high byte + buf[7] = (byte)(n.varIdx & 255); // Index, low byte + int firstChild = -1; + if (n.children.size() > 0) + firstChild = n.children.get(0).index; + buf[8] = (byte)(firstChild >> 8); + buf[9] = (byte)(firstChild & 255); + int nextSibling = -1; + if (n.parent != null) { + ArrayList siblings = n.parent.children; + for (int j = 0; j < siblings.size()-1; j++) { + if (siblings.get(j).move.equals(n.move)) { + nextSibling = siblings.get(j+1).index; + break; + } } } + buf[10] = (byte)(nextSibling >> 8); + buf[11] = (byte)(nextSibling & 255); + out.write(buf); } - buf[10] = (byte)(nextSibling >> 8); - buf[11] = (byte)(nextSibling & 255); + for (int i = 0; i < buf.length; i++) + buf[i] = -1; out.write(buf); - } - for (int i = 0; i < buf.length; i++) - buf[i] = -1; - out.write(buf); - // Write strings - buf = new byte[]{0}; - for (String name : strs) { - out.write(name.getBytes("UTF-8")); - out.write(buf); + // Write strings + buf = new byte[]{0}; + for (String name : strs) { + out.write(name.getBytes("UTF-8")); + out.write(buf); + } } - - out.close(); } } diff --git a/buildSrc/src/main/java/chess/FileUtil.java b/buildSrc/src/main/java/chess/FileUtil.java index c3da5a8..92d123a 100644 --- a/buildSrc/src/main/java/chess/FileUtil.java +++ b/buildSrc/src/main/java/chess/FileUtil.java @@ -33,13 +33,13 @@ public class FileUtil { /** Read a text file. Return string array with one string per line. */ public static String[] readFile(String filename) throws IOException { ArrayList ret = new ArrayList<>(); - InputStream inStream = new FileInputStream(filename); - InputStreamReader inFile = new InputStreamReader(inStream, "UTF-8"); - BufferedReader inBuf = new BufferedReader(inFile); - String line; - while ((line = inBuf.readLine()) != null) - ret.add(line); - inBuf.close(); + try (InputStream inStream = new FileInputStream(filename); + InputStreamReader inFile = new InputStreamReader(inStream, "UTF-8"); + BufferedReader inBuf = new BufferedReader(inFile)) { + String line; + while ((line = inBuf.readLine()) != null) + ret.add(line); + } return ret.toArray(new String[0]); } }