JavaRush /Java Blog /Random-TL /Coffee break #229. Paano magtrabaho sa mga file at Input/...

Coffee break #229. Paano magtrabaho sa mga file at Input/Output sa Java. Mga pamamaraan ng utility ng klase ng Objects

Nai-publish sa grupo

Paano magtrabaho sa mga file at Input/Output sa Java

Source: Medium Ipinapaliwanag ng tutorial na ito kung paano gumawa, magbasa, magsulat at magtanggal ng mga file sa Java. Matututuhan mo rin kung paano gumagana ang mga klase ng File , InputStream , at OutputStream . Coffee break #229.  Paano magtrabaho sa mga file at Input/Output sa Java.  Mga pamamaraan ng utility ng klase ng Objects - 1

Panimula

Sa Java, ang mga file ay kinakatawan ng klase ng File . Ang klase ng File ay nagbibigay ng mga pamamaraan para sa paglikha, pagbabasa, pagsusulat, at pagtanggal ng mga file. Ang input/output (I/O) ay ang proseso ng paglilipat ng data sa pagitan ng isang program at isang panlabas na pinagmulan, tulad ng isang file, network socket, o console. Nagbibigay ang Java ng maraming klase para sa input/output, kabilang ang mga klase ng InputStream at OutputStream .

Paglikha ng mga file

Upang lumikha ng isang file, maaari mong gamitin ang paraan ng File.createNewFile() . Gagawa ito ng bagong file kung wala pang file na may parehong pangalan. Kung mayroon nang ganoong file, ang createNewFile() na paraan ay magtapon ng IOException . Narito ang isang halimbawa kung paano gumawa ng bagong file na tinatawag na myfile.txt sa kasalukuyang direktoryo:
File myFile = new File("myfile.txt");
myFile.createNewFile();

Nagbabasa ng mga file

Upang basahin ang isang file sa Java, maaari mong gamitin ang klase ng FileInputStream . Nagbibigay ito ng mga pamamaraan para sa pagbabasa ng mga byte mula sa isang file. Upang basahin ang mga nilalaman ng isang file, dapat mong gamitin ang read() method . Ang pamamaraang ito ay nagbabasa ng isang byte mula sa isang file at ibinabalik ang halaga ng byte. Halimbawa, binabasa ng sumusunod na code ang mga nilalaman ng file na myfile.txt at ini-print ito sa console:
File myFile = new File("myfile.txt");
FileInputStream inputStream = new FileInputStream(myFile);
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
    System.out.print(new String(buffer, 0, bytesRead));
}
inputStream.close();

Pagre-record ng mga file

Upang magsulat sa isang file, maaari mong gamitin ang klase ng FileOutputStream . Nagbibigay ito ng mga pamamaraan para sa pagsulat ng mga byte sa isang file. Upang isulat ang mga nilalaman ng isang string sa isang file, gamitin ang write() method . Ang pamamaraang ito ay nagsusulat ng tinukoy na bilang ng mga byte mula sa isang tinukoy na array sa isang file. Narito ang isang halimbawa kung paano isinulat ang string na “Hello, world!”. sa myfile.txt file :
File myFile = new File("myfile.txt");
FileOutputStream outputStream = new FileOutputStream(myFile);
byte[] buffer = "Hello, world!".getBytes();
outputStream.write(buffer);
outputStream.close();

Pagtanggal ng mga file

Upang magtanggal ng file sa Java, dapat mong gamitin ang File.delete() na paraan . Kung ang file na gusto mong tanggalin ay wala, ang delete() method ay magbabalik ng false . Narito ang isang halimbawa ng code na nagtatanggal ng myfile.txt file :
File myFile = new File("myfile.txt");
myFile.delete();

Konklusyon

Sa post na ito, tinalakay namin ang mga pangunahing kaalaman sa pagtatrabaho sa mga file at I/O Java. Natutunan mo kung paano gumawa, magbasa, magsulat, at magtanggal ng mga file. Natutunan mo rin ang tungkol sa klase ng File at ang mga klase ng InputStream at OutputStream .

Mga pamamaraan ng utility ng klase ng Objects - kung paano magtrabaho sa kanila

Pinagmulan: Inside Java Sa post na ito, mapapabuti mo ang iyong kaalaman sa iba't ibang pamamaraan na ibinigay sa klase ng Objects . Ang klase ng Mga Bagay sa Java ay may maraming mga pamamaraan ng utility na nagpapadali sa pagsasagawa ng iba't ibang mga operasyon sa mga bagay. Ang klase ng Objects ay sumailalim sa ilang mga update sa mga release ng JDK : nagkaroon ng napaka makabuluhang mga update sa JDK 8 at 9, at mga menor de edad na update sa JDK 16 at 19. Tingnan natin kung paano mo magagamit ang klase ng Objects .

Paghahambing ng mga bagay

Ang mga bagay ay nagbibigay ng ilang mga pagpipilian para sa paghahambing ng mga halaga ng dalawang bagay. Ang pangunahing pakinabang ng paggamit ng pagpapatupad ng Objects ay ang kaligtasan laban sa mga null na pangyayari .

katumbas ng()

Nasa ibaba ang isang halimbawa ng paghahambing ng dalawang tala.
record RaceTime(String runnerName, Duration time) {}

RaceTime nullValue = null;
RaceTime billy =
	new RaceTime("Billy Korando", Duration.of(90, ChronoUnit.SECONDS));
RaceTime copyOfbilly =
	new RaceTime("Billy Korando", Duration.of(90, ChronoUnit.SECONDS));
RaceTime nicolai =
	new RaceTime("Nicolai Parlog", Duration.of(180, ChronoUnit.SECONDS));
nullValue.equals(billy);//NPE
Objects.equals(nullValue, billy);// false
Objects.equals(billy, nicolai);// false
Objects.equals(billy, copyOfbilly);// true

deepEquals()

Sa klase ng Objects , maaari mo ring gamitin ang deepEquals() upang ihambing ang dalawang array . Hindi tulad ng regular equals() , ito ay maghahambing ng mga halaga na nakaimbak sa mga array, na dapat humantong sa mas pare-parehong mga resulta. Sa pangkalahatan, ang pamamaraang ito ay dumadaan sa Arrays.deepEquals() .
record RaceTime(String runnerName, Duration time) {}

RaceTime billy =
	new RaceTime("Billy Korando", Duration.of(90, ChronoUnit.SECONDS));
RaceTime nicolai =
	new RaceTime("Nicolai Parlog", Duration.of(180, ChronoUnit.SECONDS));

RaceTime[] raceTimes1 = new RaceTime[] { billy, nicolai };
RaceTime[] raceTimes2 = new RaceTime[] { billy, nicolai };

Objects.equals(raceTimes1, raceTimes2);// false
Objects.deepEquals(raceTimes1, raceTimes2);// true

ihambing ()

Ang mga bagay ay mayroon ding compare() na pamamaraan , na maaaring tumagal ng dalawang bagay at isang Comparator<T> . Ang compare() method ay isa sa ilang null -unsafe na pamamaraan sa Objects dahil wala itong katanggap-tanggap na return kung ang isa sa mga argumento nito ay null .
record RaceTime(String runnerName, Duration time) {}
class RaceTimeComparator implements Comparator<RaceTime> {
@Override
public int compare(RaceTime o1, RaceTime o2) {
	return o1.time.compareTo(o2.time);
}
}
RaceTime billy =
new RaceTime("Billy Korando", Duration.of(90, ChronoUnit.SECONDS));
RaceTime nicolai =
new RaceTime("Nicolai Parlog", Duration.of(180, ChronoUnit.SECONDS));

Objects.compare(billy, nicolai, new RaceTimeComparator());//-1
Objects.compare(null, nicolai, new RaceTimeComparator());//NPE

String at HashCode

Ang klase ng Objects ay nagbibigay ng mga pamamaraan para sa pag-convert ng isang bagay sa mga halaga ng String at HashCode . Muli, ang pangunahing bentahe ng mga pamamaraang ito ay ang mga ito ay ligtas mula sa mga null na paglitaw .

I-convert sa String

Isa sa mga mas kawili-wiling pamamaraan ay toString(obj, nullDefault) , na nagbibigay ng default na halaga kung may naganap na error. Nangangahulugan ito na ibinabalik ng toIdentityString(obj) ang toString() at hashCode() ng mga naipasa na bagay na parang wala sa mga pamamaraang ito ang na-overwrite.
record RaceTime(String runnerName, Duration time) {}

RaceTime nullValue = null;
RaceTime billy =
	new RaceTime("Billy Korando", Duration.of(90, ChronoUnit.SECONDS));
RaceTime nicolai =
	new RaceTime("Nicolai Parlog", Duration.of(180, ChronoUnit.SECONDS));

Objects.toString(billy);//RaceTime[runnerName=Billy Korando, time=PT1M30S]
Objects.toString(nullValue);//null
Objects.toString(nullValue, "Did not finish");//Did not finish
Objects.toIdentityString(billy);//ObjectsExamples$1RaceTime@251a69d7

I-convert sa HashCode

Nagbibigay din ang Objects ng mga pamamaraan upang i-convert ang isang bagay sa halaga ng hash code nito.
record RaceTime(String runnerName, Duration time) {}

RaceTime nullValue = null;
RaceTime billy =
	new RaceTime("Billy Korando", Duration.of(90, ChronoUnit.SECONDS));
RaceTime nicolai =
	new RaceTime("Nicolai Parlog", Duration.of(180, ChronoUnit.SECONDS));

Objects.hashCode(nullValue);//0
Objects.hashCode(billy);//[HashValue]
Objects.hash(billy, nicolai);//[HashValue]

Sinusuri ang null

Ang klase ng Objects ay nagbibigay ng ilang paraan para sa pagsuri at paghawak ng null .

Ibinabato ang NullPointException sa null

Ang requireNonNull(obj) na paraan ay magtapon ng NullPointException kung ang value na ipinasa ay null .
record RaceTime(String runnerName, Duration time) {
	RaceTime{
		runnerName = Objects.requireNonNull(runnerName);
		time = Objects.requireNonNull(time);
	}
}

Ibinabato ang NullPointException sa null na may mensahe sa user

Ang requireNonNull(obj, String) na paraan ay magtapon ng NullPointException error na may mensahe sa user kung ang value na ipinasa ay null .
record RaceTime(String runnerName, Duration time) {
	RaceTime{
		runnerName = Objects.requireNonNull(runnerName, "runner name required!");
		time = Objects.requireNonNull(time, "race time required!");
	}
}

Ibalik ang default na halaga para sa null

Ang requireNonNullElse(obj, defaultValue) na paraan ay magbabalik ng naipasa na defaultValue kung ang obj ay null .
record RaceTime(String runnerName, Duration time) {
	RaceTime{
		runnerName = Objects.requireNonNullElse(runnerName, "John Smith");
		time = Objects.requireNonNullElse(time, Duration.ZERO);
	}
}

Paggamit ng Mga Supplier

Nagbibigay din ang klase ng Objects ng requireNonNull(obj, Supplier<String>) at T requireNonNullElseGet(T, Supplier<T>) na mga pamamaraan , na maaaring magamit upang magbigay ng mensahe o isang default na halaga. Dapat lang gamitin ang mga ito kung magkakaroon ng malaking epekto sa performance ang paggawa ng mensahe o default na value.
record RaceTime(String runnerName, Duration time) {
static Supplier<String> noNameMsgSupplier = () -> "runner name required!";
static Supplier<String> noTimeMsgSupplier = () -> "race time required!";
	RaceTime{
		runnerName = Objects.requireNonNull(runnerName, noNameMsgSupplier);
		time = Objects.requireNonNull(time, noTimeMsgSupplier);
	}
}
record RaceTime(String runnerName, Duration time) {
static Supplier<String> noNameValueSupplier = () -> "John Smith";
static Supplier<Duration> noTimeValueSupplier = () -> Duration.ZERO;
	RaceTime{
		runnerName = Objects.requireNonNullElseGet(runnerName, noNameValueSupplier);
		time = Objects.requireNonNullElseGet(time, noTimeValueSupplier);
	}
}

Predictive null check

Nagbibigay ang Objects ng null checking para sa paggamit sa mga predicate, bagama't maaari rin itong magamit sa iba pang mga sitwasyon.
record RaceTime(String runnerName, Duration time) {}

RaceTime nullValue = null;
Objects.nonNull(nullValue);//false
Objects.isNull(nullValue);//true

Pagsusuri ng index

Sa wakas, ang klase ng Objects ay nagbibigay ng ilang mga opsyon para sa pagsuri sa posisyon ng index kapag binabaybay ang isang File , String , Collection , o katulad na bagay. Ang ilan sa mga pamamaraang ito ay idinagdag kamakailan sa JDK 16.
int checkIndex(int index, int length)

int checkFromToIndex(int fromIndex, int toIndex, int length)

int checkFromIndexSize(int fromIndex, int size, int length)

long checkIndex(long index, long length)

long checkFromToIndex(long fromIndex, long toIndex, long length)

long checkFromIndexSize(long fromIndex, long size, long length)
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION