Метаданные изображения для указанного каталога в Java
Здесь у меня есть код для отображения метаданных для 1 файла. Я хотел знать, как я могу использовать для отображения метаданных для указанного каталога?
import java.io.*;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.*;
import javax.imageio.*;
import javax.imageio.stream.*;
import javax.imageio.metadata.*;
import java.util.Scanner;
public class Metadata{
public static void main(String[] args) {
Metadata meta = new Metadata();
if (new File("./images/test.jpg").exists()) {
System.out.println("Can find " + "test.jpg file");
meta.readAndDisplayMetadata("test.jpg");
} else {
System.out.println("cannot find file: " + "test.jpg");
}
}
void readAndDisplayMetadata(String fileName ) {//or String fileName
try {
File file = new File(fileName);
ImageInputStream iis = ImageIO.createImageInputStream(file);
Iterator<ImageReader> readers = ImageIO.getImageReaders(iis);
if (readers.hasNext()) {
// pick the first available ImageReader
ImageReader reader = readers.next();
// attach source to the reader
reader.setInput(iis, true);
// read metadata of first image
IIOMetadata metadata = reader.getImageMetadata(0);
String[] names = metadata.getMetadataFormatNames();
int length = names.length;
for (int i = 0; i < length; i++) {
System.out.println( "Format name: " + names[ i ] );
displayMetadata(metadata.getAsTree(names[i]));
}
}
}
catch (Exception e) {
e.printStackTrace();
}
}
void displayMetadata(Node root) {
displayMetadata(root, 0);
}
void indent(int level) {
for (int i = 0; i < level; i++)
System.out.print(" ");
}
void displayMetadata(Node node, int level) {
// print open tag of element
indent(level);
System.out.print("<" + node.getNodeName());
NamedNodeMap map = node.getAttributes();
if (map != null) {
// print attribute values
int length = map.getLength();
for (int i = 0; i < length; i++) {
Node attr = map.item(i);
System.out.print(" " + attr.getNodeName() +
"=\"" + attr.getNodeValue() + "\"");
}
}
Node child = node.getFirstChild();
if (child == null) {
// no children, so close element and return
System.out.println("/>");
return;
}
// children, so close current tag
System.out.println(">");
while (child != null) {
// print children recursively
displayMetadata(child, level + 1);
child = child.getNextSibling();
}
// print close tag of element
indent(level);
System.out.println("</" + node.getNodeName() + ">");
}
}
Я использовал DirectoryPath, но, к сожалению, ImageInputStream не имеет интерфейса для каталогов.
Существуют ли какие-либо библиотеки или платформы, которые могут автоматически предоставлять метаданные изображения для каталога в виде JSON?
1 ответ
Учитывая, что у вас уже есть код для отображения метаданных для одного файла, тривиально изменить его для поддержки нескольких файлов.
Все, что вам нужно, это isDirectory()
а также listFiles()
методы File
(или, если вы используете Java 8+, вы можете использовать Files.list(Path)
метод, для ленивых итераций *).
Если ваш входной файл является каталогом, перечислите каждый файл и введите:
public class Metadata {
public static void main(String[] args) {
Metadata meta = new Metadata();
File file = new File(args[0]);
if (file.exists()) {
System.out.println("Can find " + file);
meta.readAndDisplayMetadata(file);
}
else {
System.out.println("cannot find file: " + file);
}
}
void readAndDisplayMetadata(File file) {
// If you *don't* want recursive behavior,
// move this block "outside" or to a separate method
if (file.isDirectory()) {
File[] files = file.listFiles();
for (File f : files) {
readAndDisplayMetadata(f);
}
}
// Rest of method as is...
}
}
*) Приведенное ниже лучше, если вы можете его использовать, так как выше может не хватить памяти, если в каталоге много файлов.
void readAndDisplayMetadata(File file) throws IOException {
Path path = file.toPath();
if (Files.isDirectory(path /* optional, handle symbolic links */)) {
Files.list(path)
.forEach(p -> readAndDisplayMetadata(p.toFile()));
}
// Rest of method as is...
}