Как извлечь файл .jar

Другая идея ...

 public class ViewModelBase : INotifyPropertyChanged
{
    private Dictionary<string, object> _propertyStore = new Dictionary<string, object>();
    protected virtual void SetValue<T>(T value, [CallerMemberName] string propertyName="") {
        _propertyStore[propertyName] = value;
        OnPropertyChanged(propertyName);
    }
    protected virtual T GetValue<T>([CallerMemberName] string propertyName = "")
    {
        object ret;
        if (_propertyStore.TryGetValue(propertyName, out ret))
        {
            return (T)ret;
        }
        else
        {
            return default(T);
        }
    }

    //Usage
    //public string SomeProperty {
    //    get { return GetValue<string>();  }
    //    set { SetValue(value); }
    //}

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string propertyName)
    {
        var temp = PropertyChanged;
        if (temp != null)
            temp.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
0
задан Flimzy 7 March 2019 в 13:17
поделиться

1 ответ

JAR-файлы являются zip-архивами , а не просто сжатыми данными zlib или flate.

Поэтому используйте пакет archive/zip для правильной их обработки. Например, чтобы перечислить файлы внутри файла JAR:

r, err := zip.NewReader(bytes.NewReader(buff), int64(len(buff)))
if err != nil {
    panic(err)
}

for _, f := range r.File {
    fmt.Println("Found in jar:", f.Name)
}

Конечно, вы должны предоставить полное содержимое файла, иначе вы, скорее всего, получите ошибку при получении zip.Reader [ 1111].

Если вы также хотите распечатать содержимое файлов внутри архива, вот как вы могли бы это сделать:

for _, f := range r.File {
    fmt.Printf("Found in jar: %s, contents:\n", f.Name)
    rc, err := f.Open()
    if err != nil {
        log.Fatal(err)
    }
    _, err = io.CopyN(os.Stdout, rc, int64(f.UncompressedSize64))
    if err != nil {
        log.Fatal(err)
    }
    rc.Close()
    fmt.Println()
}

Вот файл JAR, который содержит один файл с именем a.txt, с Содержание "Hello Gopher":

buff := []byte{80, 75, 3, 4, 10, 0, 0, 0, 0, 0, 91, 109, 103, 78, 132, 225, 60, 127, 13, 0, 0, 0, 13, 0, 0, 0, 5, 0, 28, 0, 97, 46, 116, 120, 116, 85, 84, 9, 0, 3, 206, 17, 129, 92, 219, 17, 129, 92, 117, 120, 11, 0, 1, 4, 232, 3, 0, 0, 4, 232, 3, 0, 0, 72, 101, 108, 108, 111, 32, 71, 111, 112, 104, 101, 114, 10, 80, 75, 1, 2, 30, 3, 10, 0, 0, 0, 0, 0, 91, 109, 103, 78, 132, 225, 60, 127, 13, 0, 0, 0, 13, 0, 0, 0, 5, 0, 24, 0, 0, 0, 0, 0, 1, 0, 0, 0, 164, 129, 0, 0, 0, 0, 97, 46, 116, 120, 116, 85, 84, 5, 0, 3, 206, 17, 129, 92, 117, 120, 11, 0, 1, 4, 232, 3, 0, 0, 4, 232, 3, 0, 0, 80, 75, 5, 6, 0, 0, 0, 0, 1, 0, 1, 0, 75, 0, 0, 0, 76, 0, 0, 0, 0, 0}

При запуске вышеуказанного кода в этом буфере вывод получится (попробуйте на Go Playground ):

Found in jar: a.txt, contents:
Hello Gopher
0
ответ дан icza 7 March 2019 в 13:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: