30 Kasım 2016 Çarşamba

Files Sınıfı

Files Sınıfı
Giriş
Şu satırı dahil ederiz.
import java.nio.file.Files;
Bu sınıf ObjectsArrays gibi tamamen static metodlardan oluşan yardımcı bir sınıftır. Açıklaması şöyle.
This class consists exclusively of static methods that operate on files, directories, or other types of files.
copy metodu Path + Path + options
İki tane File ile şöyle yaparız. File nesneleri yine Path tipine çevriliyor.
void copyFile(File source, File dest) throws IOException {
  Files.copy(source.toPath(), dest.toPath());
}
İki tane Path ile şöyle yaparız.
Path sourceFile = ...;
Path targetFile = ...;
// copy..
Files.copy(sourceFile,targetFile, StandardCopyOption.REPLACE_EXISTING);
copy metodu - InputStream+ Path + options
Bir InputStream bir Path ile şöyle yaparız.
URL url = ...;
Path targetPath = ...;
Files.copy(url.openStream(), targetPath,StandardCopyOption.REPLACE_EXISTING);
createDirectory metodu
Şöyle yaparız. Metod exception atabilir.
Path dirPath = ...;
if(Files.notExists(dirPath)){
  try{
    Files.createDirectory(dirPath);
  } catch(java.io.IOException e){
   ...
  }
}
createDirectories metodu
Şöyle yaparız.
Path path = ...;
Files.createDirectories(path);
isRegularFile metodu
Şöyle yaparız.
Path filePath = ...;
if (Files.isRegularFile(filePath)) {...}
isWritable metodu
Şöyle yaparız.
Path path = Paths.get("path/to/my/file");

// is it writable? If no, consider "read only"
boolean canWrite = Files.isWritable(path);
lines metodu
Şöyle yaparız.
String file = ...;
try(Stream<String> stream = Files.lines(Paths.get(file))) {
  stream....;
}
move metodu
Şöyle yaparız.
Path fileToMovePath = ...;
Path targetPath = ...;
Files.move(fileToMovePath, targetPath.resolve(fileToMovePath.getFileName()));
newBufferedWriter metodu
Şöyle yaparız.
BufferedWriter w = Files.newWriter(file, Charsets.UTF_8);
newDirectoryStream metodu
Sadece verilen dizini dolaşır. Yani özyinelemeli (recursive) değildir. Şöyle yaparız.
Path searchPath = Paths.get("c://log");
try (DirectoryStream<Path> fileList = Files.newDirectoryStream(searchPath)) {
  for (Path path : fileList) {
    System.out.println(path.getFileName());
}
newInputStream metodu
Elimizde bir path olsun
Path path = Paths.get("path/to/my/file");
Şöyle yaparız.
try (
    final InputStream in = Files.newInputStream(path);
) {
    // work with "in"
}
newOutputStream metodu
Dosya yoksa yaratılır. Varsa sonuna ekleme yapılır. Şöyle yaparız.
Path source1 = Paths.get("src1.txt");
Path source2 = Paths.get("src2.txt");

Path destination = Paths.get("dest.txt");    
out = Files.newOutputStream(destination, CREATE, APPEND);

Files.copy(source1, destination, StandardCopyOption.REPLACE_EXISTING);
Files.copy(source2, destination);
notExists metodu
Şöyle yaparız.
Path dirPath = ...;
if(Files.notExists(dirPath)){
  Files.createDirectory(dirPath);
}  
readAllBytes metodu
İçi şöyle. Stream'in açılıp kapatıldığı görülebilir.
public static byte[] readAllBytes(Path path) throws IOException {
  try (SeekableByteChannel sbc = Files.newByteChannel(path);
    InputStream in = Channels.newInputStream(sbc)) {
    long size = sbc.size();
    if (size > (long)MAX_BUFFER_SIZE)
      throw new OutOfMemoryError("Required array size too large");

    return read(in, (int)size);
  }
}
readAttributes metodu
BasiFileAttributes nesnesi döner. Şöyle yaparız
Path file = ...;
BasicFileAttributes attr = Files.readAttributes(file, BasicFileAttributes.class);
walk metodu
Java 8 ile geldi. Stream<Path> tipinden bir nesne döndürür. Özyinelemeli (recursive) olarak dizini dolaşır. Şöyle yaparız.
Path path = //...
try {
    Files.walk(path).map(Path::getFileName).forEach(System.out::println);
} catch (IOException e) {
    e.printStackTrace();
}
Stream Path listesi döndürür. File listesine çevirmek için şöyle yaparız.
List<File> filesInFolder = Files
    .walk(Paths.get("C:/Users/Desktop/read"))
    .filter(Files::isRegularFile).map(Path::toFile)
    .collect(Collectors.toList());
Bu kod yerine eski File.listFiles çok daha kolay olabilir. Şöyle yaparız.
File file = new File("C:/Users/Desktop/read");
File[] filesInFolder = file.listFiles();
walkFileTree metodu
Java 7 ile şöyle yaparız.
Path src = ...;
Files.walkFileTree(src, new SimpleFileVisitor<Path>(){...});
Şöyle yaparız.
Path src = ...;
Files.walkFileTree(src, 
                   EnumSet.of(FileVisitOption.FOLLOW_LINKS), 
                   Integer.MAX_VALUE,
                   new SimpleFileVisitor<Path>() {...}
);
write metodu - byte [] + options
Şöyle yaparız.
try {
  Files.write(Paths.get("f.txt"), "text".getBytes(), StandardOpenOption.APPEND);
}catch (IOException e) {
  ...
}
Dosya yoksa yaratmak, varsa ekleme yapmak için şöyle yaparız.
String message = "bla";
Files.write(
  Paths.get(".queue"),
  message.getBytes(),
  StandardOpenOption.CREATE,
  StandardOpenOption.APPEND);
write metodu - byte [] + charset
Şöyle yaparız.
Path path = ...;
Files.write(path,"text".getBytes(),StandardCharsets.UTF_8);
SimpleFileVisitor Sınıfı
Bu sınıf bize default boş metodlar tanımladığı için tüm metodlarını override etmek zorunda değiliz
previsitDirectory metodu
Şöyle yaparız.
@Override
public FileVisitResult preVisitDirectory(Path dir,
              BasicFileAttributes attrs) throws IOException {
  dir.toString(); //İşlenen dizin
  ...
  return FileVisitResult.CONTINUE;
}
visitFile metodu
Şöyle yaparız.
@Override
public FileVisitResult visitFile(Path file,
              BasicFileAttributes attrs) throws IOException {
  ...
  return FileVisitResult.CONTINUE;
}
Eğer arama dursun istersek şunu döneriz.
return FileVisitResult.TERMINATE;
İşlenen dosyanın yolu şöyle alınır.
file.getFileName()