ජාවා භාවිතා කර පේළියකින් විශාල පෙළ ගොනු රේඛාවක් කියවන්නේ කෙසේද?


862

මට ජාවා භාවිතා කරමින් රේඛාව අනුව 5-6 GB පමණ විශාල පෙළ ගොනුවක් කියවීමට අවශ්‍යයි.

මට මෙය ඉක්මනින් කළ හැක්කේ කෙසේද?


71
ama කමාසි සහ. අල්. මෙම ප්‍රශ්නය අනුපිටපතක් ලෙස සලකුණු නොකළ යුතුය. "අන්තිම පේළිය ඉක්මණින් කියවීම" විකල්පයක් නොවන අතර, "පෙළ-ගොනු රේඛාව අනුව කියවීමට ඉක්මන්ම ක්‍රමය" යන්න විවාදාත්මක ය. යමක් කිරීමට ඉක්මන්ම ක්‍රමය අනිවාර්යයෙන්ම පොදු ක්‍රමය නොවේ. තවද, පහත දැක්වෙන පිළිතුරු වලට කේතය ඇතුළත් වේ, ඔබ ලැයිස්තු ගත කරන වඩාත්ම අදාළ විකල්පය ඇතුළත් නොවේ. මෙම ප්රශ්නය ප්රයෝජනවත් වේ. එය දැනට "java read file line by line" සඳහා ඉහළම ගූගල් සෙවුම් ප්‍රති result ලය වේ. අවසාන වශයෙන්, තොග පිටාර ගැලීම වෙත ළඟා වීම සහ සෑම ප්‍රශ්නය 2 න් 1 ක්ම බැහැර කිරීම සඳහා සලකුණු කර ඇති බව සොයා ගන්න.
පැට්‍රික් කලන්

5
හැකි ක්‍රියාත්මක කිරීම් හයක් සඳහා වේගය සංසන්දනය කිරීම මෙන්න .
සර්ග් එම් ටෙන්

4
SO හි සමීප ප්‍රතිපත්තිය උරා බොන බවට තර්ක කරමින් මම අදහස් කියවමින් සිටියද, SO එය දිගටම පවතියි. ඕනෑම වියදමකින් අතිරික්තය වළක්වා ගැනීමට අවශ්‍ය වන්නේ එතරම් පටු මනසක් ඇති සංවර්ධක ඉදිරිදර්ශනයකි! එය එසේ වීමට ඉඩ දෙන්න! ක්රීම් ඉහළට නැඟී ඇති අතර sh * t පතුලේ ගිලෙනු ඇත. මීට පෙර ප්‍රශ්නයක් අසනු ලැබුවද (කුමන ප්‍රශ්නය නොවේද ??), එයින් අදහස් කරන්නේ නව ප්‍රශ්නයකට එය වඩා හොඳින් වාක්‍ය ඛණ්ඩනය කිරීමට, වඩා හොඳ පිළිතුරු ලබා ගැනීමට, සෙවුම් යන්ත්‍රවල ඉහළ ශ්‍රේණියක් ලබා ගැනීමට නොහැකි විය හැකි බව නොවේ. ප්‍රශ්නය දැන් 'ආරක්‍ෂිත' ....
ස්ටිජන් ඩි විට්

3
මාතෘකාව කියවීමෙන් ප්‍රශ්න අනුපිටපතක් ලෙස සලකුණු කරන්නේ කෙසේද යන්න ඇදහිය නොහැකි තරම් ය.
ලූක්

Answers:


1083

පොදු රටාවක් භාවිතා කිරීම

try (BufferedReader br = new BufferedReader(new FileReader(file))) {
    String line;
    while ((line = br.readLine()) != null) {
       // process the line.
    }
}

අක්ෂර කේතන ක්‍රමයක් නොමැති යැයි ඔබ සිතන්නේ නම් ඔබට දත්ත වේගයෙන් කියවිය හැකිය. උදා: ASCII-7 නමුත් එය එතරම් වෙනසක් නොකරනු ඇත. දත්ත සමඟ ඔබ කරන දේ බොහෝ කාලයක් ගතවනු ඇතැයි සිතිය හැකිය.

සංස්කරණය කරන්න: lineකාන්දු වීමේ විෂය පථය වළක්වන භාවිතා කිරීමට අඩු පොදු රටාවක් .

try(BufferedReader br = new BufferedReader(new FileReader(file))) {
    for(String line; (line = br.readLine()) != null; ) {
        // process the line.
    }
    // line is not visible here.
}

යාවත්කාලීන කිරීම: ජාවා 8 හි ඔබට කළ හැකිය

try (Stream<String> stream = Files.lines(Paths.get(fileName))) {
        stream.forEach(System.out::println);
}

සටහන: #close ක්‍රමය ඒ සඳහා කැඳවීම සහතික කිරීම සඳහා ඔබ උත්සාහය -සම්පත්-සම්පත් කොටසක තැබිය යුතුය, එසේ නොමැතිනම් GC බොහෝ කලකට පසුව එය සිදු කරන තුරු යටින් පවතින ගොනු හසුරුව කිසි විටෙකත් වසා නැත.


6
නිසි ව්‍යතිරේක හැසිරවීමකින් මෙම රටාව මොන වගේද? Br.close () IOException විසි කරන බව මම සටහන් කරමි, එය පුදුම සහගතය - කියවීම සඳහා විවෘත කර ඇති ගොනුවක් වසා දැමීමේදී කුමක් සිදුවිය හැකිද? FileReader හි ඉදිකිරීම්කරු විසින් FileNotFound ව්‍යතිරේකයක් විසි කළ හැකිය.
මයික් බී

3
මා සතුව 200MB ගොනුවක් තිබේ නම් සහ එය 90MB / s ට කියවිය හැකි නම් එය ~ 3s ගතවනු ඇතැයි මම අපේක්ෂා කරමි? මෙම "මන්දගාමී" කියවීමේ ක්‍රමය සමඟ මගේ මිනිත්තු කිහිපයක් ගත වන බව පෙනේ. මම එස්එස්ඩී එකක සිටිමි, එබැවින් කියවීමේ වේගය ගැටලුවක් නොවිය යුතුද?
ජිව් මෙං

4
@JiewMeng SO ඔබ කරන තවත් දෙයක් සඳහා කාලය ගතවේ යැයි මම සැක කරමි. එම ගොනුව හා රේඛා කියවීමෙන් ඔබ උත්සාහ කළ හැකි කිසිවක් වෙන.
පීටර් ලෝරි

46
ඇයි for(String line = br.readLine(); line != null; line = br.readLine())Btw, ජාවා 8 හි ඔබට කළ හැක්කේ try( Stream<String> lines = Files.lines(...) ){ for( String line : (Iterable<String>) lines::iterator ) { ... } }වෛර නොකිරීමට අපහසුය.
ඇලෙක්සැන්ඩර් ඩුබින්ස්කි

26
LeAleksandrDubinsky ජාවා 8 හි වසා දැමීමේ ගැටලුව නම් එය ඉතා පහසුවෙන් කියවීමට කේතය වඩාත් සංකීර්ණ කරවීමයි (එසේම මන්දගාමී වීම) බොහෝ සංවර්ධකයින් එය “සිසිල්” නිසා එය අධික ලෙස භාවිතා කරන බව මට පෙනේ.
පීටර් ලෝරි

157

මෙම බ්ලොගය දෙස බලන්න:

බෆරයේ ප්‍රමාණය නියම කළ හැකිය, නැතහොත් පෙරනිමි ප්‍රමාණය භාවිතා කළ හැකිය. පෙරනිමිය බොහෝ අරමුණු සඳහා ප්‍රමාණවත් තරම් විශාලය.

// Open the file
FileInputStream fstream = new FileInputStream("textfile.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));

String strLine;

//Read File Line By Line
while ((strLine = br.readLine()) != null)   {
  // Print the content on the console
  System.out.println (strLine);
}

//Close the input stream
fstream.close();

6
මගේ ගොනුව ගිග් 1.5 ක් වන අතර ඔබේ පිළිතුර භාවිතා කර ගොනුව කියවිය නොහැක!
අබූසාර් රාජාබි

3
Bo අබූසර් රාජාබි ඇත්තෙන්ම එය කළ හැකි ය. මෙම කේතයට ඕනෑම පෙළ ගොනුවක් කියවිය හැකිය.
මාක්විස් ඔෆ් ලෝර්න්

11
දුර්වල ගුණාත්මක සබැඳියක් සඳහා පහත් කොට ඇත. සම්පූර්ණයෙන්ම තේරුමක් නැති DataInputStreamඅතර වැරදි ධාරාව වසා ඇත. ජාවා නිබන්ධනයේ කිසිදු වරදක් නොමැති අතර අත්තනෝමතික තෙවන පාර්ශවීය අන්තර්ජාල කුණු මේ ආකාරයෙන් සඳහන් කිරීම අවශ්‍ය නොවේ.
මාර්ක්විස් ඔෆ් ලෝර්න්

3
මම අදහස් ඉවත් කරන්නම්, ඔබට පේළි 6 ක් සඳහා 100% අතිරික්ත අදහස් පේළි 4 ක් ඇත.
බෆලෝ

102

ජාවා 8 අවසන් වූ පසු (2014 මාර්තු) ඔබට ධාරාවන් භාවිතා කළ හැකිය:

try (Stream<String> lines = Files.lines(Paths.get(filename), Charset.defaultCharset())) {
  lines.forEachOrdered(line -> process(line));
}

ගොනුවේ සියලුම පේළි මුද්‍රණය කිරීම:

try (Stream<String> lines = Files.lines(file, Charset.defaultCharset())) {
  lines.forEachOrdered(System.out::println);
}

1
සංක්ෂිප්ත භාවය සඳහා භාවිතා කරන්න StandardCharsets.UTF_8, භාවිතා කරන්න , Stream<String>සහ භාවිතා කිරීමෙන් වළකින්න forEach()සහ විශේෂයෙන් forEachOrdered()හේතුවක් නොමැති නම්.
ඇලෙක්සැන්ඩර් ඩුබින්ස්කි

2
සෑම () සඳහාම වැළකී සිටින්නේ ඇයි? එය නරකද?
steventrouble

ForEachOrded වෙනුවට මම සෑම කෙනෙකුටම නම්, රේඛා පිළිවෙලට මුද්‍රණය කළ හැකිය, එසේ නොවේ ද?
msayag

2
ventsteventrouble බලන්න: stackoverflow.com/questions/16635398/… ඔබ වැනි කෙටි ශ්‍රිත යොමු කිරීමක් සමත් වුවහොත් එය නරක නැත forEach(this::process), නමුත් ඔබ ඇතුළත ලැම්බඩා ලෙස කේත කොටස් ලිවුවහොත් එය කැත forEach()වේ.
ඇලෙක්සැන්ඩර් ඩුබින්ස්කි

2
@msayag, ඔබ හරි, ඔබට forEachOrderedපිළිවෙලට ක්‍රියාත්මක කිරීමට අවශ්‍යයි . ගොනුවට පේළි දහස් ගණනක් ඇත්නම් මිස සමාන්තරකරණය සක්‍රිය නොවන බව මට පෙනී ගියද, එම අවස්ථාවේ දී ඔබට ධාරාව සමාන්තරගත කිරීමට නොහැකි වනු ඇති බව මතක තබා ගන්න.
ඇලෙක්සැන්ඩර් ඩුබින්ස්කි

38

පූර්ව ජාවා 7 සඳහා සම්පූර්ණ දෝෂ හැසිරවීම සහ සහාය අක්ෂර පිරිවිතරයන් සහිත නියැදියක් මෙන්න. ජාවා 7 සමඟ ඔබට උත්සාහ කරන්න-සම්පත්-සින්ටැක්ස් භාවිතා කළ හැකිය, එමඟින් කේතය පිරිසිදු කරයි.

ඔබට පෙරනිමි අක්ෂර කට්ටලය අවශ්‍ය නම් ඔබට ආදාන ප්‍රවාහය මඟ හැර FileReader භාවිතා කළ හැකිය.

InputStream ins = null; // raw byte-stream
Reader r = null; // cooked reader
BufferedReader br = null; // buffered for readLine()
try {
    String s;
    ins = new FileInputStream("textfile.txt");
    r = new InputStreamReader(ins, "UTF-8"); // leave charset out for default
    br = new BufferedReader(r);
    while ((s = br.readLine()) != null) {
        System.out.println(s);
    }
}
catch (Exception e)
{
    System.err.println(e.getMessage()); // handle exception
}
finally {
    if (br != null) { try { br.close(); } catch(Throwable t) { /* ensure close happens */ } }
    if (r != null) { try { r.close(); } catch(Throwable t) { /* ensure close happens */ } }
    if (ins != null) { try { ins.close(); } catch(Throwable t) { /* ensure close happens */ } }
}

සම්පූර්ණ දෝෂ හැසිරවීම සහිත Groovy අනුවාදය මෙන්න:

File f = new File("textfile.txt");
f.withReader("UTF-8") { br ->
    br.eachLine { line ->
        println line;
    }
}

1
එය කුමක්ද කරන්නේ ByteArrayInputStreamවිශාල පෙළ ගොනුව කියවීමේ සමඟ ඔබට ඇති ප්රායෝගික වැලක් පෝෂණය?
ලෝර්න් හි මාක්විස්

සම්පූර්ණයෙන්ම නිෂ් less ල වසා දමයි. සෑම ධාරාවක්ම වැසීමට ශුන්‍ය හේතුවක් තිබේ. ඔබ එම ධාරාවන්ගෙන් කිසිවක් වසා දැමුවහොත් ඔබ අනෙක් සියලුම ධාරාවන් ස්වයංක්‍රීයව වසා
දමයි

21

ජාවා 8 හි ඔබට කළ හැක්කේ:

try (Stream<String> lines = Files.lines (file, StandardCharsets.UTF_8))
{
    for (String line : (Iterable<String>) lines::iterator)
    {
        ;
    }
}

සමහර සටහන්: ආපසු හරවන ලද ධාරාව Files.lines(බොහෝ ධාරාවන් මෙන් නොව) වසා දැමිය යුතුය. මෙහි සඳහන් කර ඇති හේතු නිසා මම භාවිතා කිරීමෙන් වැළකී සිටිමි forEach(). අමුතු කේතය (Iterable<String>) lines::iteratorනැවත ගලා යා හැකි ධාරාවකට යොමු කරයි.


Iterableමෙම කේතය ක්‍රියාත්මක නොකිරීමෙන් ප්‍රයෝජනවත් වුවද නිශ්චිතවම කැතයි . වැඩ කිරීමට එයට වාත්තු (එනම් (Iterable<String>)) අවශ්‍ය වේ.
ස්ටෙෆාන්

මෙම ක්‍රමය සමඟ පළමු පේළිය මඟ හැරිය හැක්කේ කෙසේද?
qed

2
edqedfor(String line : (Iterable<String>) lines.skip(1)::iterator)
ඇලෙක්සැන්ඩර් ඩුබින්ස්කි

1
ඇත්ත වශයෙන්ම ඔබ පාවිච්චි කිරීමට අදහස් කරනවා නම් නෑ Streamවිශේෂාංග, භාවිතා Files.newBufferedReaderවෙනුවට Files.linesනැවත නැවතත් ඉල්ලා readLine()තෙක් nullවැනි නිර්මාණය කරන භාවිතා කරනු වෙනුවට (Iterable<String>) lines::iteratorබොහෝ සරල බව පෙනේ ...
Holger

ඔබ :: පේළි :: iterator භාවිතා කරන්නේ ඇයි? :: සඳහා මා දන්නා එකම ක්‍රමය වන්නේ ක්‍රමයේ නම ලැම්බඩා ශ්‍රිතයට ඇසුරුම් කිරීමයි. පසු ලූප පරාමිතිය සඳහා: ඔබ භාවිතා කරමින් යම් ලැම්බඩා ක්‍රමයක් ලබා ගන්නා අතර විචල්‍ය විය යුතුය ::
Trismegistos

19

ඔබට කළ හැක්කේ ස්කෑනරය භාවිතයෙන් සම්පූර්ණ පා sc ය පරිලෝකනය කර පෙළ රේඛාව ඔස්සේ ගමන් කිරීමයි. ඇත්ත වශයෙන්ම ඔබ පහත සඳහන් දෑ ආනයනය කළ යුතුය:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public static void readText throws FileNotFoundException {
    Scanner scan = new Scanner(new File("samplefilename.txt"));
    while(scan.hasNextLine()){
        String line = scan.nextLine();
        //Here you can manipulate the string the way you want
    }
}

ස්කෑනරය මූලික වශයෙන් සියලුම පෙළ පරිලෝකනය කරයි. මුළු ලූපය හරහා ගමන් කිරීම සඳහා කාල පුඩුවක් භාවිතා කරයි.

මෙම .hasNextLine()කාර්යය තවමත් පෙළ තවත් පේලි තිබේ නම්, සැබෑ ආපසු හරවා යවන වීජ වේ. මෙම .nextLine()ක්රියාව මඟින් ඔබට ඔබ ඔබට අවශ්ය ආකාරයට භාවිතා කළ හැකි වන සංගීත ලෙස සමස්ත මාර්ගය ලබා දෙයි. System.out.println(line)පෙළ මුද්‍රණය කිරීමට උත්සාහ කරන්න .

පැති සටහන: .txt යනු ගොනු වර්ගයේ පෙළයි.


මේ වෙනුවට ක්‍රම ප්‍රකාශය නොපෙන්විය යුතුද: ´ පොදු ස්ථිතික අවලංගු කියවීම ටෙක්ස්ට් ෆයිල්නොට්ෆවුන්ඩ්එක්සෙප්ෂන් () {´ වැනි: ublic මහජන ස්ථිතික අවලංගු කියවීම් ටෙක්ස්ට් () ෆයිල්නොට්ෆවුන්ඩ්එක්සෙප්ෂන් විසි කරයි {´
කෙට්කොම්ප්

මෙය වඩා මන්දගාමී BufferedReader.readLine()වන අතර ඔහු හොඳම ක්‍රියාකාරී ක්‍රමය ඉල්ලා සිටියේය.
මාර්ක්විස් ඔෆ් ලෝර්න්

19

මම ජාවා හි ගොනුවක් කියවීමට විවිධ ක්‍රම 10 ක් ලේඛනගත කර පරීක්‍ෂා කළ අතර ඒවා 1KB සිට 1GB දක්වා පරීක්ෂණ ලිපිගොනු කියවීමට සලස්වා ඒවා එකිනෙකට එරෙහිව ධාවනය කළෙමි . 1GB පරීක්ෂණ ගොනුවක් කියවීම සඳහා වේගවත්ම 3 ගොනු කියවීමේ ක්‍රම මෙන්න.

කාර්ය සාධන පරීක්ෂණ ක්‍රියාත්මක කිරීමේදී මම කොන්සෝලය වෙත කිසිවක් ප්‍රතිදානය නොකළ බැවින් එය පරීක්ෂණය මන්දගාමී වනු ඇති බව සලකන්න. අමු කියවීමේ වේගය පරීක්ෂා කිරීමට මට අවශ්‍ය විය.

1) java.nio.file.Files.readAllBytes ()

ජාවා 7, 8, 9 හි පරීක්ෂා කර ඇත. මෙය සමස්තයක් වශයෙන් වේගවත්ම ක්‍රමයයි. 1GB ගොනුවක් කියවීම නිරතුරුවම තත්පර 1 ට අඩු විය.

import java.io..File;
import java.io.IOException;
import java.nio.file.Files;

public class ReadFile_Files_ReadAllBytes {
  public static void main(String [] pArgs) throws IOException {
    String fileName = "c:\\temp\\sample-1GB.txt";
    File file = new File(fileName);

    byte [] fileBytes = Files.readAllBytes(file.toPath());
    char singleChar;
    for(byte b : fileBytes) {
      singleChar = (char) b;
      System.out.print(singleChar);
    }
  }
}

2) java.nio.file.Files.lines ()

මෙය ජාවා 8 සහ 9 හි සාර්ථකව අත්හදා බැලූ නමුත් ලැම්බඩා ප්‍රකාශන සඳහා සහය නොලැබීම නිසා එය ජාවා 7 හි ක්‍රියා නොකරනු ඇත. 1GB ගොනුවක කියවීමට තත්පර 3.5 ක් පමණ ගත වූ අතර එය විශාල ලිපිගොනු කියවීම තරම් දෙවන ස්ථානයට පත්විය.

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.stream.Stream;

public class ReadFile_Files_Lines {
  public static void main(String[] pArgs) throws IOException {
    String fileName = "c:\\temp\\sample-1GB.txt";
    File file = new File(fileName);

    try (Stream linesStream = Files.lines(file.toPath())) {
      linesStream.forEach(line -> {
        System.out.println(line);
      });
    }
  }
}

3) බෆර්ඩ් රීඩර්

ජාවා 7, 8, 9 හි වැඩ කිරීමට පරීක්ෂා කර ඇත. මෙය 1GB පරීක්ෂණ ගොනුවකින් කියවීමට තත්පර 4.5 ක් පමණ ගත විය.

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class ReadFile_BufferedReader_ReadLine {
  public static void main(String [] args) throws IOException {
    String fileName = "c:\\temp\\sample-1GB.txt";
    FileReader fileReader = new FileReader(fileName);

    try (BufferedReader bufferedReader = new BufferedReader(fileReader)) {
      String line;
      while((line = bufferedReader.readLine()) != null) {
        System.out.println(line);
      }
    }
  }

ඔබ සියලු 10 ගොනුව කියවීම ක්රම සඳහා සම්පූර්ණ ශ්රේණිගත සොයා ගත හැකි මෙහි .


1
ඔබේ මාර්ගෝපදේශය විශ්මයජනකයි :)
ෆයිසාල් ජුලයිඩන්

ඔබ වැඩිපුරම කාලය ගත System.out.print/println()කරන්නේ මෙහි ය; ඔබගේ පළමු අවස්ථා දෙකේදී ගොනුව මතකයට ගැලපෙනු ඇතැයි ඔබ උපකල්පනය කරයි.
මාර්ක්විස් ඔෆ් ලෝර්න්

සාමාන්යයෙන් ප්රමාණවත්. සමහර විට මට එම උපකල්පන මගේ පිළිතුරෙන් වඩාත් පැහැදිලිව ඉදිරිපත් කිරීමට ඉඩ තිබුණි.
ගෝමිෂා

18

FileReader ඔබට කේතීකරණය නියම කිරීමට ඉඩ නොදේ, ඔබට එය නියම කිරීමට InputStreamReaderඅවශ්‍ය නම් ඒ වෙනුවට භාවිතා කරන්න:

try {
    BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), "Cp1252"));         

    String line;
    while ((line = br.readLine()) != null) {
        // process the line.
    }
    br.close();

} catch (IOException e) {
    e.printStackTrace();
}

ඔබ මෙම ගොනුව වින්ඩෝස් වෙතින් ආනයනය කළේ නම්, එයට ANSI කේතීකරණ (Cp1252) තිබිය හැක, එබැවින් ඔබට කේතන ක්‍රමය නියම කළ යුතුය.


16

ජාවා 7 හි:

String folderPath = "C:/folderOfMyFile";
Path path = Paths.get(folderPath, "myFileName.csv"); //or any text file eg.: txt, bat, etc
Charset charset = Charset.forName("UTF-8");

try (BufferedReader reader = Files.newBufferedReader(path , charset)) {
  while ((line = reader.readLine()) != null ) {
    //separate all csv fields into string array
    String[] lineVariables = line.split(","); 
  }
} catch (IOException e) {
    System.err.println(e);
}

9
පරීක්ෂාකාරී වන්න! line.split භාවිතා කිරීමෙන් ක්ෂේත්‍රයක් කොමාවකින් සමන්විත වන අතර එය උපුටා දැක්වීම් වලින් වටවී තිබේ නම් මේ ආකාරයෙන් නිසි ලෙස විග්‍රහ නොකරනු ඇත. මෙම භේදය එය නොසලකා හරිමින් අභ්‍යන්තර කොමාව භාවිතයෙන් කුට්ටි කැබලි වලින් වෙන් කරයි. එච්ටීඑච්, මාර්සෙලෝ.
මාර්සෙලෝ ෆින්කි

CSV: කොමා වලින් වෙන් කරන ලද වටිනාකම් ගොනුව, එබැවින් ඔබ වෙනත් ක්ෂේත්‍රයක් එක් කිරීමට අදහස් කරන්නේ නම් මිස, ඔබ csv ක්ෂේත්‍රයක කොමාව භාවිතා නොකළ යුතුය. ඒ නිසා, භාවිතය කොමා ටෝකනයෙහි ජාවා සඳහා භේදය CSV ගොනුවක් මාණකරනය ක්රියාත්මක හොඳින් දඩයක් හා හරි විට
ඩියාගෝ Duarte

7
ඩියාගෝ, මෙය නිවැරදි නොවේ. එකම CSV ප්‍රමිතිය (RFC 4180) විශේෂයෙන් පවසන්නේ “රේඛා බිඳීම් (CRLF), ද්විත්ව මිල ගණන් සහ කොමාව අඩංගු ක්ෂේත්‍ර ද්විත්ව උපුටා දැක්වීම්වල ඇතුළත් කළ යුතු” බවයි.
serg.nechaev

2
StandardCharsets.UTF_8පරීක්ෂා කළ ව්‍යතිරේකය වළක්වා ගැනීමට භාවිතා කරන්නCharset.forName("UTF-8")
ඇලෙක්සැන්ඩර් ඩුබින්ස්කි

2
ඔබගේ අදහස් දැක්වීමට ස්තූතියි "ඩියාගෝ ඩුආර්ට්"; "serg.nechaev" පිළිතුරු දෙන දෙයට මා එකඟ බව පැවසිය යුතුය. සීඑස්වී ලිපිගොනු තුළ කොමාව කාවැදී ඇති බව මට පෙනේ. මෙය පිළිගනු ඇතැයි ජනතාව අපේක්ෂා කරති. සියළුම ගෞරව සහිතව. "serg.nechaev" ට විශාල ස්තූතියක්. IMHO ඔබ හරි. හැමෝටම ප්‍රීති වන්න.
මාර්සෙලෝ ෆින්කි

13

ජාවා 8 හි භාවිතා කිරීමට විකල්පයක් ද ඇත Files.lines(). ඔබේ ආදාන ප්‍රභවය ගොනුවක් නොව a Readerහෝ an වැනි වියුක්ත යමක් නම් InputStream, ඔබට s හරහා රේඛා ප්‍රවාහනය කළ හැකියBufferedReaderlines() ක්රමය.

උදාහරණයක් වශයෙන්:

try (BufferedReader reader = new BufferedReader(...)) {
  reader.lines().forEach(line -> processLine(line));
}

processLine()කියවන සෑම ආදාන රේඛාවක් සඳහාම කැඳවනු ඇත BufferedReader.


10

සඳහා ගොනු කියවීම ජාවා සමග 8

package com.java.java8;

import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Stream;

/**
 * The Class ReadLargeFile.
 *
 * @author Ankit Sood Apr 20, 2017
 */
public class ReadLargeFile {

    /**
     * The main method.
     *
     * @param args
     *            the arguments
     */
    public static void main(String[] args) {
        try {
            Stream<String> stream = Files.lines(Paths.get("C:\\Users\\System\\Desktop\\demoData.txt"));
            stream.forEach(System.out::println);
        }
        catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

9

ඔබට ස්කෑනර් පන්තිය භාවිතා කළ හැකිය

Scanner sc=new Scanner(file);
sc.nextLine();

2
Im ටිම් 'බෝම්බ බිහිසුණු' යනු සීඑස් හි මා හඳුනාගත් යෙදුමක් නොවේ. ඔබ හරියටම අදහස් කරන්නේ කුමක්ද?
ලෝර්න්

බොග් ඩවුන්, ඉතා සෙමින් ක්‍රියාත්මක කරන්න, බොහෝ විට බිඳ වැටීම. මම බොහෝ විට මෙම වෙබ් අඩවියේ මෝඩයන් මග හැරිය යුතුය;)
ටිම්

4
Im ටිම් එය එසේ කරන්නේ ඇයි?
xehpuk

2
භාවිතා Scannerකිරීම හොඳයි, නමුත් මෙම පිළිතුරට එය නිසි ලෙස භාවිතා කිරීම සඳහා සම්පූර්ණ කේතය ඇතුළත් නොවේ.
ඇලෙක්සැන්ඩර් ඩුබින්ස්කි

5
ImTim මෙම කේතය 'දරුණු ලෙස බෝම්බ හෙලීම' හෝ 'වංචා කිරීම' හෝ 'ඉතා සෙමින් ක්‍රියාත්මක කිරීම' හෝ 'බොහෝ විට බිඳ වැටීම' සිදු නොවේ. ඇත්ත වශයෙන්ම ලියා ඇති පරිදි එය කියවන්නේ එක් පේළියක් පමණි, ක්ෂණිකවම. ඔබට තත්පරයට මෙගාබයිට් කියවිය හැකිය, BufferedReader.readLine()නිසැකවම කිහිප ගුණයකින් වේගවත් වුවද. ඔබ වෙනත් ආකාරයකින් සිතන්නේ නම් කරුණාකර ඔබේ හේතු ඉදිරිපත් කරන්න.
මාර්ක්විස් ඔෆ් ලෝර්න්

7

ඔබ තුළ readLine()ක්‍රමය භාවිතා කළ class BufferedReaderයුතුය. එම පන්තියෙන් නව වස්තුවක් සාදා ඔහු මත මෙම ක්‍රමය ක්‍රියාත්මක කර එය නූලකට සුරකින්න.

බෆර් රීඩර් ජාවඩොක්


BufferReaderAPI වෙත සබැඳිය කැඩී ඇති බවක් පෙනේ
සන්දීප්

6

මෙය සාක්ෂාත් කර ගැනීමට පැහැදිලි මාර්ගය,

උදාහරණයක් වශයෙන්:

තිබේ නම්, ඔබ dataFile.txtඔබේ වත්මන් බහලුම මත

import java.io.*;
import java.util.Scanner;
import java.io.FileNotFoundException;

public class readByLine
{
    public readByLine() throws FileNotFoundException
    {
        Scanner linReader = new Scanner(new File("dataFile.txt"));

        while (linReader.hasNext())
        {
            String line = linReader.nextLine();
            System.out.println(line);
        }
        linReader.close();

    }

    public static void main(String args[])  throws FileNotFoundException
    {
        new readByLine();
    }
}

ප්‍රතිදානය පහත පරිදි වේ, රූප විස්තරය මෙහි ඇතුළත් කරන්න


එය පැහැදිලි වන්නේ ඇයි? පෙළෙහි පින්තූර මෙහි පළ නොකරන්න. පෙළ පළ කරන්න.
ලෝර්න් හි මාක්විස්

ඔබ පින්තූරයක් පළ කළා. එය පෙළෙහි පින්තූරයකි. ඔබට මෙම පිටුව කෙලින්ම කපා කොටුවට ඇලවිය හැකිය. වැඩසටහන් පළ කිරීම ගැන කිසිවෙකු කිසිවක් කීවේ නැත. පෙළෙහි පින්තූර පළ කිරීම ඔබේ කාලය නාස්ති කිරීමක් වන අතර එය මා ගණන් ගන්නේ නැත, සහ මම කරන ඔබේ කලාප පළල.
මාක්විස් ඔෆ් ලෝර්න්

6

ජාවා 9:

try (Stream<String> stream = Files.lines(Paths.get(fileName))) {
    stream.forEach(System.out::println);
}

2
මම හිතන්නේ ඔබට එසේ කළ යුතුයිSystem.getProperty("os.name").equals("Linux")
ස්ප්‍රිංලර්නර්

5
නූල් සමඟ සංසන්දනය නොකරන්න ==!
ජොනාස් - මොනිකා

7
දැනටමත් වෙනත් අය විසින් පළ කර ඇති පරිදි මෙය කැනොනිකල් ජාවා 8 උදාහරණයයි. මෙය “ජාවා -9” යැයි ඔබ කියන්නේ ඇයි?
හොල්ගර්

Ol ඔහු සඳහන් කිරීමට අමතක කළ හොල්ගර් මතක සිතියම්ගත කළ ලිපිගොනු විය හැකිද?
ඉයුජින්

පේළියකින් එය රේඛාව සැකසීමට ඔබට උත්සාහ කළ හැකිය (ධාරාව <String> stream = Files.lines (Paths.get (inputFile))) {stream.forEach ((line) -> {System.out.println (line);} ); }
thanos.a

3
BufferedReader br;
FileInputStream fin;
try {
    fin = new FileInputStream(fileName);
    br = new BufferedReader(new InputStreamReader(fin));

    /*Path pathToFile = Paths.get(fileName);
    br = Files.newBufferedReader(pathToFile,StandardCharsets.US_ASCII);*/

    String line = br.readLine();
    while (line != null) {
        String[] attributes = line.split(",");
        Movie movie = createMovie(attributes);
        movies.add(movie);
        line = br.readLine();
    }
    fin.close();
    br.close();
} catch (FileNotFoundException e) {
    System.out.println("Your Message");
} catch (IOException e) {
    System.out.println("Your Message");
}

එය මට වැඩ කරයි. එය ඔබටත් උපකාරී වනු ඇතැයි බලාපොරොත්තු වෙමු.


3

එය වඩාත් නිවැරදිව කිරීමට ඔබට ධාරාවන් භාවිතා කළ හැකිය:

Files.lines(Paths.get("input.txt")).forEach(s -> stringBuffer.append(s);

2
එය ඇත්තෙන්ම හොඳයි කියා මම එකඟ වෙමි. අමුතු StringBuffer තේරීම නිසා මිනිසුන් එයට අකමැති වේ (StringBuilder සාමාන්‍යයෙන් කැමති වන්නේ එය විචල්‍යයට නරක නමක් වුවද). එය දැනටමත් ඉහත සඳහන් කර ඇති නිසා ය.
ඇන්ඩ්‍රි රුබ්ට්සොව්

2

මම සාමාන්‍යයෙන් කියවීමේ පුරුද්ද කෙළින්ම කරමි:

void readResource(InputStream source) throws IOException {
    BufferedReader stream = null;
    try {
        stream = new BufferedReader(new InputStreamReader(source));
        while (true) {
            String line = stream.readLine();
            if(line == null) {
                break;
            }
            //process line
            System.out.println(line)
        }
    } finally {
        closeQuiet(stream);
    }
}

static void closeQuiet(Closeable closeable) {
    if (closeable != null) {
        try {
            closeable.close();
        } catch (IOException ignore) {
        }
    }
}

0

ඔබට මෙම කේතය භාවිතා කළ හැකිය:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class ReadTextFile {

    public static void main(String[] args) throws IOException {

        try {

            File f = new File("src/com/data.txt");

            BufferedReader b = new BufferedReader(new FileReader(f));

            String readLine = "";

            System.out.println("Reading file using Buffered Reader");

            while ((readLine = b.readLine()) != null) {
                System.out.println(readLine);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}

පැහැදිලි කිරීමක් පිළිවෙලට වනු ඇත.
පීටර් මෝර්ටෙන්සන්

0

Org.apache.commons.io පැකේජය භාවිතා කිරීමෙන් , එය වැඩි කාර්ය සාධනයක් ලබා දුන්නේය, විශේෂයෙන් ජාවා 6 සහ ඊට පහළ භාවිතා කරන පැරණි කේත වල.

අඩු ව්‍යතිරේක හැසිරවීම් සහ වඩා ප්‍රයෝජනවත් ක්‍රම සහිත වඩා හොඳ API එකක් ජාවා 7 සතුව ඇත:

LineIterator lineIterator = null;
try {
    lineIterator = FileUtils.lineIterator(new File("/home/username/m.log"), "windows-1256"); // The second parameter is optionnal
    while (lineIterator.hasNext()) {
        String currentLine = lineIterator.next();
        // Some operation
    }
}
finally {
    LineIterator.closeQuietly(lineIterator);
}

මේවන්

<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>

0

ඔබට Apache Commons IO ද භාවිතා කළ හැකිය :

File file = new File("/home/user/file.txt");
try {
    List<String> lines = FileUtils.readLines(file);
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

3
FileUtils.readLines(file)අතහැර දැමූ ක්‍රමයකි. මීට අමතරව, මෙම ක්‍රමය IOUtils.readLinesමඟින් බෆර්ඩ් රීඩර් සහ අරා ලැයිස්තු භාවිතා කරයි. මෙය රේඛීයව රේඛීය ක්‍රමයක් නොවන අතර නිසැකවම GB කිහිපයක් කියවීම සඳහා ප්‍රායෝගික එකක් නොවේ.
vallismortis
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.