Soru Java'daki bir dizeye tam metin dosyası


Java'nın C # ne sahip olduğu gibi bir metin dosyasına okunması için bir satır talimatı var mı?

Java’da buna eşdeğer bir şey var mı?

String data = System.IO.File.ReadAllText("path to file");

Değilse ... bunu yapmak için 'optimal yol' nedir?

Düzenle:
Java standart kütüphanelerinde bir yolu tercih ederim ... 3. parti kütüphaneleri kullanamam ..


44
2017-10-03 12:25


Menşei


Bu yazının benim için yararlı olduğunu anladım. stackoverflow.com/questions/7463414/...


Cevaplar:


AFAIK, standart kütüphanelere sahip tek lineli yoktur. Standart kütüphanelerle tipik yaklaşım şöyle bir şey olurdu:

public static String readStream(InputStream is) {
    StringBuilder sb = new StringBuilder(512);
    try {
        Reader r = new InputStreamReader(is, "UTF-8");
        int c = 0;
        while ((c = r.read()) != -1) {
            sb.append((char) c);
        }
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
    return sb.toString();
}

Notlar:

  • amacıyla dosyadan metni oku, FileInputStream'i kullan
  • performans önemliyse ve büyük dosyaları okuyorsunuz, akışı BufferedInputStream içinde sarmak tavsiye edilir
  • akış arayan tarafından kapatılmalıdır

18
2017-10-03 12:30



Tamponlu okuyucunun bir seferde bir karakter okumadan daha iyi bir okuma çizgisi vardır. - Steven
Bir BufferedInputStream kullanırsanız, bu bir fark yaratmaz - Neeme Praks
Bu şekilde dizeye son (-1) ekler. - Alec
Hayır değil. Durum sırasında bunu kontrol eder (c! = -1) - Neeme Praks
Bu gerçekten havalı değil. Dönüş dizgisi, döngü sırasında dikkatsiz kodlama nedeniyle daima -1 ile biter. - Miles Chen


apache commons-io vardır:

String str = FileUtils.readFileToString(file, "utf-8");

Ancak standart java sınıflarında böyle bir fayda yoktur. Eğer (bir nedenden ötürü) harici kütüphaneleri istemiyorsan, onu yeniden düzenlemelisin. İşte bazı örnekler vardır ve alternatif olarak, commons-io veya Guava tarafından nasıl uygulandığını görebilirsiniz.


42
2017-10-03 12:26



Kullanırdım FileUtils.readFileToString(file,encoding)versiyon - iyi alışkanlıklar önerebilir! - Nick
@Nick - öneri için teşekkürler - Bozho


Ana Java kütüphanelerinde değil, ama kullanabilirsiniz Guava:

String data = Files.asCharSource(new File("path.txt"), Charsets.UTF_8).read();

Ya da satırları okumak için:

List<String> lines = Files.readLines( new File("path.txt"), Charsets.UTF_8 );

Tabii ki ben de benzer şekilde kolaylaştıracak başka 3. parti kütüphaneleri olduğundan eminim - Guava'ya en aşina olduğumdan eminim.


21
2017-10-31 21:43





Java 7 bu üzücü durumdaki gelişmeleri iyileştirir Files sınıf (Guava's ile karıştırılmamalıdır aynı ismin sınıfı), tüm satırları bir dosyadan (harici kütüphaneler olmadan) alabilirsiniz:

List<String> fileLines = Files.readAllLines(path, StandardCharsets.UTF_8);

Veya bir String’e:

String contents = new String(Files.readAllBytes(path), StandardCharsets.UTF_8);
// or equivalently:
StandardCharsets.UTF_8.decode(ByteBuffer.wrap(Files.readAllBytes(path)));

Temiz bir JDK ile kutunun dışında bir şeye ihtiyacınız varsa, bu harika çalışıyor. Yani, neden Guava olmadan Java yazıyorsun?


20
2018-05-04 11:07





İçinde Java 8 (harici kütüphaneler yok) akışları kullanabilirsiniz. Bu kod bir dosya okuyor ve ',' ile ayrılmış tüm satırları bir String'e koyuyor.

try (Stream<String> lines = Files.lines(myPath)) {
    list = lines.collect(Collectors.joining(", "));
} catch (IOException e) {
    LOGGER.error("Failed to load file.", e);
}

9
2017-12-30 08:44





Path path = FileSystems.getDefault().getPath(directory, filename);
String fileContent = new String(Files.readAllBytes(path), StandardCharsets.UTF_8);

3
2018-01-07 13:31



Not String(byte[], String) bir atar UnsupportedEncodingException. Tercih etmelisin String(byte[], Charset) sabitler ile birlikte kurucu StandardCharsets veya Guava'nın Charsets. - dimo414


  String fileContent="";
  try {
          File f = new File("path2file");
          FileInputStream inp = new FileInputStream(f);
          byte[] bf = new byte[(int)f.length()];
          inp.read(bf);
          fileContent = new String(bf, "UTF-8");
      } catch (FileNotFoundException e) {
          e.printStackTrace();
      } catch (IOException e) {
          e.printStackTrace();
      }

1
2018-03-10 12:02





Kullan fileContentsFromLocalFilePath() sağlanan yöntem Test aşağıdaki sınıf:

import org.apache.commons.io.IOUtils;

import java.io.*;

public class Test
{
    private static String fileContentsFromLocalFilePath(String localFilePath)
    {
        //initially empty file content
        String emptyContent = "";

        try
        {
            //we assume that file exists
            File localFile = new File(localFilePath);

            //if local file does not exist (as a directory or a file);
            //else if local file does exist, but does not refer to file; throw exception
            if(!localFile.exists() || (localFile.exists() && !localFile.isFile()))
                throw new IllegalArgumentException("Provided path: " + localFilePath + "does not exist or it does not refer to a file");


            //at this point localFile exists and it is actually a file
            InputStream inputStream = new FileInputStream(localFile);

            //write the result to String writer
            StringWriter writer = new StringWriter();
            IOUtils.copy(inputStream, writer, "UTF-8");


            //return the file contents string
            return writer.toString();
        } // try
        catch(Exception ex)
        {
            //report the exception to the user
            ex.printStackTrace();

            //in other cases return empty string
            return emptyContent;
        } // catch
    } // fileContentsFromLocalFilePath

} // Test 

0
2018-04-09 13:02





Bir metin dosyasını bir satırda, bir döngü gerektirmeden okumak için 3 yol vardır. Belgeledim Java'da bir dosyadan okunmanın 15 yolu ve bunlar bu makaleden.

Dosyanın içeriğini okumak için yapılan gerçek çağrının döngü gerektirmeden sadece 1 satır gerektirmesine rağmen, yine de döndürülen listeden geçmeniz gerektiğini unutmayın.

1) java.nio.file.Files.readAllLines () - Varsayılan Kodlama

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

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

    List  fileLinesList = Files.readAllLines(file.toPath());

    for(String line : fileLinesList) {
      System.out.println(line);
    }
  }
}

2) java.nio.file.Files.readAllLines () - Açık Kodlama

import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.List;

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

    //use UTF-8 encoding
    List  fileLinesList = Files.readAllLines(file.toPath(), StandardCharsets.UTF_8);

    for(String line : fileLinesList) {
      System.out.println(line);
    }
  }
}

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

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-10KB.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);
    }
  }
}

0