يبدو أن BufferedReader يقرأ السطر الأخير فقط من الملف

StackOverflow https://stackoverflow.com/questions/3480270

  •  28-09-2019
  •  | 
  •  

سؤال

أحاول أن أكتب طريقة لأخذ ملف multiline multipited وأرجع محتويات هذا الملف كقائمة arraylist من صفائف السلسلة (كل سطر عبارة ). مشكلتي هي ، لا يمكنني معرفة ما إذا كان الإخراج صحيحًا أم لا. لقد قمت بطباعة عنصر ArrayList وعنصر String [] أثناء حفظها إلى قائمة ArrayList ، وتبدو تلك الطباعة صحيحة. ولكن بعد إرجاع ArrayList وأطبع السلسلة [] فيها ، يبدو أن لديهم فقط محتويات السطر الأخير من الملف. أظن أنه قد يكون شيئًا عن Filereader أو BufferredReader لا أعرفه. anyhoo ، إليك الرمز:

public class DataParsingTest {

    static File AAPLDailyFile = new File("./textFilesForMethodTests/dataParsingPractice2.tsv");

    public static void main(String[] args) throws FileNotFoundException, IOException {
        ArrayList<String[]> stringArrayList = fileToStringArray(AAPLDailyFile);
        System.out.println("stringArray.size() = " + stringArrayList.size());
        System.out.println(stringArrayList.get(0)[0]);

        for (int i = 0; i < stringArrayList.size(); i++) {
            for (int j = 0; j < stringArrayList.get(i).length; j++) {
                System.out.println("index of arraylist is " + i + " and element at index " + j + " of that array is " + stringArrayList.get(i)[j]);
            }
        }
    }

    public static ArrayList<String[]> fileToStringArray(File file) throws FileNotFoundException, IOException {
        ArrayList<String[]> arrayListOfStringArrays = new ArrayList<String[]>();
        FileReader fileReader = new FileReader(file);
        BufferedReader bufferedReader = new BufferedReader(fileReader);
        int nextChar = 0;
        int noOfTokens = 1; // because the first token doesn't have a tab or newline before it
        int startIndex = 0, endIndex = 0, tokenIndex = 0;
        String toRead = "";
        toRead = bufferedReader.readLine();
        for (int i = 0; i < toRead.length(); i++) {
            if (toRead.charAt(i) == '\t') {
                noOfTokens++;
            }
        }
        System.out.println("noOfTokens = " + noOfTokens);
        bufferedReader.close();
        fileReader.close();
        String[] productString = new String[noOfTokens];
        startIndex = 0;
        endIndex = 0;
        tokenIndex = 0;
        FileReader fileReader2 = new FileReader(file);
        BufferedReader bufferedReader2 = new BufferedReader(fileReader2);

        tokenIndex = 0;
        int count = 1;
        while ((toRead = bufferedReader2.readLine()) != null) { 
            System.out.println("toRead = " + toRead);
            startIndex = -1; // [L - so that the first time an array element is assigned, it's upped to 0]
            endIndex = 0;
            tokenIndex = 0;
            while (true) {  
                endIndex = toRead.indexOf("\t", startIndex + 1);  
                if (endIndex == -1) {
                    productString[tokenIndex] = toRead.substring(startIndex + 1);
                    System.out.println("tokenIndex = " + tokenIndex);
                    System.out.println("productString[" + tokenIndex + "] = " + productString[tokenIndex]);
                    tokenIndex++;
                    count++;
                    arrayListOfStringArrays.add(productString);
                    System.out.println("just added an array to the list. the first element is " + productString[0]);
                    break;
                }
                productString[tokenIndex] = toRead.substring(startIndex + 1, endIndex);
                System.out.println("tokenIndex = " + tokenIndex);
                System.out.println("productString[" + tokenIndex + "] = " + productString[tokenIndex]);
                startIndex = endIndex;
                tokenIndex++;
                count++;
            }
        }
        fileReader2.close();
        bufferedReader2.close();
        return arrayListOfStringArrays;
    }
}

ملف الإدخال هو:

1   2
3   4
5   6

الإخراج هو:

noOfTokens = 2
toRead = 1        2
tokenIndex = 0
productString[0] = 1
tokenIndex = 1
productString[1] = 2
just added an array to the list. the first element is 1
toRead = 3        4
tokenIndex = 0
productString[0] = 3
tokenIndex = 1
productString[1] = 4
just added an array to the list. the first element is 3
toRead = 5        6
tokenIndex = 0
productString[0] = 5
tokenIndex = 1
productString[1] = 6
just added an array to the list. the first element is 5
stringArray.size() = 3
5 // from here on up, it looks like the method works correctly
index of arraylist is 0 and element at index 0 of that array is 5
index of arraylist is 0 and element at index 1 of that array is 6
index of arraylist is 1 and element at index 0 of that array is 5
index of arraylist is 1 and element at index 1 of that array is 6
index of arraylist is 2 and element at index 0 of that array is 5
index of arraylist is 2 and element at index 1 of that array is 6 //these 6 lines only reflect the last line of the input file.

شكرا ميل!

هل كانت مفيدة؟

المحلول

أنت فقط إنشاء ملف غير مرتبطة سلسلة سلسلة ، وإعادة استخدام ذلك لجميع الخطوط. بحيث ArrayList فقط يحتوي على مراجع متعددة إلى نفس الكائن. عليك أن تفهم ذلك عند الاتصال arrayListOfStringArrays.add(productString); هذا لا يضيف نسخة من المصفوفة إلى ArrayList - إنها مجرد إضافة أ المرجعي. (قيمة ال productString هو مجرد مرجع ، وليس الصفيف نفسه.)

فقط حرك هذا:

String[] productString = new String[noOfTokens];

داخل ال while حلقة ، وجميع يجب أن يكون على ما يرام. (في هذا الصدد ، على أي حال. يجب عليك أيضًا إغلاق مقابض ملفك finally كتل.)

نصائح أخرى

هذا يبدو أن الكثير من التعليمات البرمجية بالنسبة لي للمعالجة. جرب هذا تغيير fileToStringArray طريقة.

public static ArrayList<String[]> fileToStringArray(File file) throws FileNotFoundException, IOException {
    ArrayList<String[]> returnVal = new ArrayList<String[]>();
    // Scanner is a nifty utility for reading Files
    Scanner fIn = new Scanner(file);
    // keep reading while the Scanner has lines to process
    while (fIn.hasNextLine()) {
        // take the next line of the file, and split it up by each tab
        // and add that String[] to the list
        returnVal.add(fIn.nextLine().split("\t", -1));
    }
    return returnVal;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top