2013-11-02 126 views
1

我該如何改變這種情況,從加載.bin文件改爲.txt文件。我想將.txt文件中的信息像.bin文件一樣放入hashmap中。Java從.bin文件轉換爲.txt文件加載器

public static int currency; 
    public HashMap<Integer, Shop> cars = new HashMap<Integer, Car>();  
public void load() { 
      try { 
       @SuppressWarnings("resource") 
       RandomAccessFile carFile = new RandomAccessFile("data/cars.bin", "r"); 
       int carsAmt = carFile.readShort(); 
       for (int carId = 0; carId < carAmt; carId++) { 
        int carId = carFile.readShort(); 
        int currency = carFile.readShort(); 
        int[] cars = new int[carFile.readByte()]; 
        int[] amounts = new int[cars.length]; 
        boolean isTruck = carFile.read() == 1; 
        for (int carData = 0; carData < cars.length; carData++) { 
         cars[carData] = carFile.readShort(); 
         amounts[carData] = carFile.readInt(); 
        } 
        cars.put(carId, new Car(carId, currency, isTruck, cars, amounts, true)); 
       } 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      System.out.println("Loaded " + cars.size() + " Cars"); 
     } 
+0

RandomAccessFile可以讀取任何文件。 – Radiodef

+0

爲什麼不能將''data/cars.bin''改成''data/cars.txt'''? – vandale

回答

2

bintxt只是名稱的一部分。但是,按照慣例,txt文件包含使用許多字符編碼之一格式化的數據。常見的編碼是UTF-8和ASCII的擴展。 「編碼」只是字節序列到字符的映射。例如,在UTF-8中,a映射到8位序列01100001(十六進制爲61)。實際上,所有文件都存儲爲一系列0 s和1 s,但txt文件通常只存儲根據其編碼的序列。相比之下,bin文件將包含以「二進制」格式存儲的數據;也就是說,它們中的數據不符合任何類型的文本編碼。在你的情況下,bin文件只包含一組以二進制表示形式存儲的數字(它是一系列位或0和1)。你的問題的答案是,你將不得不重寫這段代碼。由於您現在想要讀取文本文件而不是直接使用二進制值,因此您需要一個能夠將您的txt文件解碼爲String的閱讀器,然後您還需要將這些Strings轉換爲數字值。 (此步驟稱爲「解析」。)

需要知道您的txt文件的編碼才能正確讀取它。 RandomAccessFile有一個讀取UTF-8編碼文本的方法,但如果它是另一種編碼,則需要在別處查看。有關使用BufferedReader的一些信息,請參閱this answer。您也可能會發現Scanner類很有用。 Scanner可以在讀取它們時解析這些值。

+0

希望我可以投票贊成100倍。優秀的答案。 –