2015-04-23 4 views
0

Я читаю Snappy Compressed file от местного до java.Ошибка при чтении Скучный сжатый файл

File snappyFile = new File(fileName); 
Configuration conf = new Configuration();    
CompressionCodec codec = (CompressionCodec) 
ReflectionUtils.newInstance(SnappyCodec.class, conf); 
FileInputStream is2 = new FileInputStream(snappyFile); 
CompressionInputStream cis = codec.createInputStream(is2); 
BufferedReader cr = new BufferedReader(new InputStreamReader(cis)); 

Мой код получает исключение в ReflectionUtils.newInstance

Exception in thread "main" java.lang.RuntimeException: java.lang.NoSuchMethodException: org.xerial.snappy.SnappyCodec.<init>() 
    at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:128) 
    at org.finra.oats.AWS.AWSnappyRead.run(AWSnappyRead.java:64) 
    at org.finra.oats.AWS.AWSnappyRead.main(AWSnappyRead.java:48) 
Caused by: java.lang.NoSuchMethodException: org.xerial.snappy.SnappyCodec.<init>() 
    at java.lang.Class.getConstructor0(Class.java:2849) 
    at java.lang.Class.getDeclaredConstructor(Class.java:2053) 
    at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:122) 
    ... 2 more 

Является ли это из-за версии проблемы несоответствия. Я использую snappy 1.1.1.2 версия

+0

Из вашего вопроса и предоставленной statcktrace это не совсем понятно, чего вы хотите достичь. Вы хотите прочитать сжатый файл Snappy из файловой системы? – SubOptimal

+0

Вы должны перефразировать свой вопрос. Кажется, вы пытаетесь прочитать файл последовательности Hadoop. Возможно, этот SO-поток [Чтение и запись Sequencefile с использованием Hadoop 2.0 Apis] (http://stackoverflow.com/questions/16070587) может вам помочь. – SubOptimal

+0

Я уже разместил его там [ссылка] (http://stackoverflow.com/questions/29816067/how-to-read-snappy-compressed-file-from-s3-in-java). вы можете обратиться к ссылке, чтобы получить краткую идею. – salmanbw

ответ

1

Чтобы прочитать и записать сжатый файл Snappy, вы можете использовать предоставленные классы /SnappyOutputStream.

String fileName = "foo.snap"; 

// write a snappy compressed file 
try (OutputStream os = new SnappyOutputStream(new FileOutputStream(fileName))) { 
    os.write("Hello Snappy-World".getBytes(Charset.defaultCharset())); 
} 

// read a snappy compressed file 
try (InputStream is = new SnappyInputStream(new FileInputStream(fileName))) { 
    byte[] bytes = new byte[100]; 
    is.read(bytes); 
    System.out.println(new String(bytes, Charset.defaultCharset())); 
} 

// check if the file is compressed with the snappy algorithm 
try (InputStream is = new FileInputStream(fileName)) { 
    SnappyCodec readHeader = SnappyCodec.readHeader(is); 
    if (readHeader.isValidMagicHeader()) { 
     System.out.println("is a Snappy compressed file"); 
     System.out.printf("%s: %d%n%s: %d%n", 
       "compatible version", readHeader.compatibleVersion, 
       "version", readHeader.version 
     ); 
    } else { 
     System.out.println("is not a Snappy compressed file");     
    } 
} 
+0

yes SubOptimal, я хочу прочитать сжатый файл Snappy из файловой системы. Я пробовал ваш код, но я получаю эту ошибку. java.io.IOException: FAILED_TO_UNCOMPRESS (5) at org.xerial.snappy.SnappyNative.throw_error (SnappyNative.java:84) – salmanbw

+0

@ user3375762 Могут быть разные причины. Файл не сжимается Snappy или поврежден. Можете ли вы послать hexdump первых 16 байтов? – SubOptimal

+0

@ user3375762 Это выглядит не как сжатый сжатый файл. Магический заголовок сжатого сжатого файла определяется как «MAGIC_HEADER = новый байт [] {-126, 'S', 'N', 'A', 'P', 'P', 'Y', 0};' – SubOptimal

Смежные вопросы