ගොනුවකින් සියලුම පෙළ කියවන්න
ජාවා 11 මඟින් කුඩා ලිපිගොනු කියවීමට readString () ක්රමය එකතු කරන ලදි, රේඛීය පර්යන්තString
ආරක්ෂා කරයි:
String content = Files.readString(path, StandardCharsets.US_ASCII);
ජාවා 7 සහ 11 අතර අනුවාද සඳහා, මෙන්න උපයෝගීතා ක්රමයකින් ඔතා ඇති සංයුක්ත ශක්තිමත් මෝඩකමක්:
static String readFile(String path, Charset encoding)
throws IOException
{
byte[] encoded = Files.readAllBytes(Paths.get(path));
return new String(encoded, encoding);
}
ගොනුවකින් පෙළ පේළි කියවන්න
ජාවා 7 ගොනුවක් පෙළ රේඛා ලෙස කියවීමට පහසු ක්රමයක් එකතු කළ අතර එය a List<String>
. එක් එක් පේළියේ කෙළවරේ සිට රේඛා බෙදුම්කරුවන් ඉවත් කර ඇති නිසා මෙම ප්රවේශය "පාඩු" වේ.
List<String> lines = Files.readAllLines(Paths.get(path), encoding);
ජාවා 8 Files.lines()
මඟින් නිෂ්පාදනය කිරීමේ ක්රමය එකතු කරන ලදී Stream<String>
. නැවතත්, මෙම ක්රමය පාඩු වන්නේ රේඛා බෙදුම්කරුවන් ඉවත් කර ඇති බැවිනි. IOException
ගොනුව කියවන විට එය හමු වුවහොත් , එය ඔතා ඇත UncheckedIOException
, මන්ද Stream
පරීක්ෂා කළ ව්යතිරේකයන් විසි කරන ලැම්බඩා පිළිගන්නේ නැත.
try (Stream<String> lines = Files.lines(path, encoding)) {
lines.forEach(System.out::println);
}
මේ Stream
සඳහා close()
ඇමතුමක් අවශ්යයි ; මෙය API හි දුර්වල ලෙස ලේඛනගත කර ඇති අතර, බොහෝ අය ක්රමවේදයක් Stream
ඇති බව close()
නොදැනේ යැයි මම සැක කරමි . පෙන්වා ඇති පරිදි ARM- බ්ලොක් එකක් භාවිතා කිරීමට වග බලා ගන්න.
ඔබ ගොනුවක් හැර වෙනත් ප්රභවයක් සමඟ වැඩ කරන්නේ නම්, ඒ වෙනුවට ඔබට lines()
ක්රමය භාවිතා කළ හැකිය BufferedReader
.
මතක භාවිතය
රේඛීය බිඳීම් ආරක්ෂා කරන පළමු ක්රමය, තාවකාලිකව ගොනුවේ ප්රමාණය මෙන් කිහිප ගුණයක් මතකය අවශ්ය වේ, මන්ද කෙටි කාලයක් සඳහා අමු ගොනු අන්තර්ගතය (බයිට් අරා) සහ විකේතනය කළ අක්ෂර (ඒ සෑම එකක්ම බිටු 16 ක් කේතනය කර තිබුණත්) ගොනුවේ බිටු 8 ක් ලෙස) එකවර මතකයේ රැඳේ. පවතින මතකයට සාපේක්ෂව කුඩා යැයි ඔබ දන්නා ලිපිගොනු වලට අයදුම් කිරීම ආරක්ෂිත වේ.
දෙවන ක්රමය, රේඛා කියවීම සාමාන්යයෙන් වඩා මතක කාර්යක්ෂම වේ, මන්ද විකේතනය සඳහා ආදාන බයිට් බෆරය මුළු ගොනුවම අඩංගු නොවිය යුතුය. කෙසේ වෙතත්, පවතින මතකයට සාපේක්ෂව ඉතා විශාල ගොනු සඳහා එය තවමත් සුදුසු නොවේ.
විශාල ලිපිගොනු කියවීම සඳහා, ඔබේ වැඩසටහන සඳහා වෙනස් මෝස්තරයක් අවශ්ය වේ, එය ධාරාවකින් පෙළ කැබැල්ලක් කියවා, එය ක්රියාවට නංවා, ඊළඟට ඉදිරියට ගොස් එකම ස්ථාවර ප්රමාණයේ මතක වාරණයක් නැවත භාවිතා කරයි. මෙන්න, "විශාල" පරිගණක පිරිවිතර මත රඳා පවතී. වර්තමානයේ, මෙම සීමාව බොහෝ ගිගාබයිට් RAM විය හැකිය. තෙවන ක්රමය, a භාවිතා කිරීම Stream<String>
මෙය කළ හැකි එක් ක්රමයකි, ඔබේ ආදාන “වාර්තා” තනි රේඛා වේ නම්. ( readLine()
ක්රමවේදය භාවිතා BufferedReader
කිරීම මෙම ප්රවේශයට සමාන ක්රියා පටිපාටිය වේ.)
අක්ෂර කේතන
මුල් පෝස්ට් එකේ නියැදියෙන් අස්ථානගත වී ඇති එක් දෙයක් නම් අක්ෂර කේතනයයි. වේදිකා පෙරනිමිය ඔබට අවශ්ය විශේෂ අවස්ථා කිහිපයක් ඇත, නමුත් ඒවා දුර්ලභ වන අතර ඔබේ තේරීම සාධාරණීකරණය කිරීමට ඔබට හැකි විය යුතුය.
මෙම StandardCharsets
පන්තියේ සියලුම ජාවා runtimes අවශ්ය වන ගැනීමේදී කේතන ක්රමවල සඳහා යම් යම් නියත නිර්වචනය:
String content = readFile("test.txt", StandardCharsets.UTF_8);
වේදිකාව පෙරනිමි සිට ලබා ගත හැකි වේ ද Charset
පන්ති ය:
String content = readFile("test.txt", Charset.defaultCharset());
සටහන: මෙම පිළිතුර බොහෝ දුරට මගේ ජාවා 6 අනුවාදය ප්රතිස්ථාපනය කරයි. ජාවා 7 හි උපයෝගීතාව කේතය ආරක්ෂිතව සරල කරන අතර, සිතියම්ගත කළ බයිට් බෆරයක් භාවිතා කළ පැරණි පිළිතුර, සිතියම්ගත කළ බෆරය කසළ එකතු කරන තෙක් කියවූ ගොනුව මකා දැමීම වලක්වනු ලැබීය. මෙම පිළිතුරෙහි "සංස්කරණය කරන ලද" සබැඳිය හරහා ඔබට පැරණි අනුවාදය නැරඹිය හැකිය.