Как программно заархивировать файл в Android? - PullRequest
0 голосов
/ 03 января 2019

Я знаю, что этот вопрос уже существует, но я не уверен, как реализовать его в моем случае ...

Сначала я создал DataOutuputStream, который будет записывать в файл с расширением .uedl:

private static DataOutputStream os;
public static final String BASE_PATH = Environment.getExternalStorageDirectory().getAbsolutePath() + "/myApp/logs/"


public static void startReceiveLogs() {
    if (debugBaudRate > -1) {
        mReadFlag = true;
        String time = TimeUtils.getCurrentTime(TimeZone.getDefault());
        try {
            os = new DataOutputStream(new FileOutputStream(BASE_PATH + time + "_logs.uedl"));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        mReceiveLogsThread = new Thread(new ReceiveLogsThread());
        mReceiveLogsThread.start();
    }
}

Вот что пишет:

        public void run() {
        byte[] rbuf = new byte[64];
        while (mReadFlag) {
            try {
                int len = mSerial.readLog(rbuf, mSerialPortLog);
                if (len > 0) {
                    os.write(rbuf, 0, len);
                }
            } catch (NullPointerException e1) {
                e1.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

Как только этот поток перестанет работать, я бы хотел сжать этот файл по тому же пути.

1 Ответ

0 голосов
/ 03 января 2019

Попробуйте, это поможет вам

 public boolean zipFileAtPath(String sourcePath, String toLocation) {
    final int BUFFER = 2048;

    File sourceFile = new File(sourcePath);
    try {
        BufferedInputStream origin = null;
        FileOutputStream dest = new FileOutputStream(toLocation);
        ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(
                dest));
        if (sourceFile.isDirectory()) {
            zipSubFolder(out, sourceFile, sourceFile.getParent().length());
        } else {
            byte data[] = new byte[BUFFER];
            FileInputStream fi = new FileInputStream(sourcePath);
            origin = new BufferedInputStream(fi, BUFFER);
            ZipEntry entry = new ZipEntry(getLastPathComponent(sourcePath));
            entry.setTime(sourceFile.lastModified()); // to keep modification time after unzipping
            out.putNextEntry(entry);
            int count;
            while ((count = origin.read(data, 0, BUFFER)) != -1) {
                out.write(data, 0, count);
            }
        }
        out.close();
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
    return true;
}


 private void zipSubFolder(ZipOutputStream out, File folder,
                          int basePathLength) throws IOException {

    final int BUFFER = 2048;

    File[] fileList = folder.listFiles();
    BufferedInputStream origin = null;
    for (File file : fileList) {
        if (file.isDirectory()) {
            zipSubFolder(out, file, basePathLength);
        } else {
            byte data[] = new byte[BUFFER];
            String unmodifiedFilePath = file.getPath();
            String relativePath = unmodifiedFilePath
                    .substring(basePathLength);
            FileInputStream fi = new FileInputStream(unmodifiedFilePath);
            origin = new BufferedInputStream(fi, BUFFER);
            ZipEntry entry = new ZipEntry(relativePath);
            entry.setTime(file.lastModified()); // to keep modification time after unzipping
            out.putNextEntry(entry);
            int count;
            while ((count = origin.read(data, 0, BUFFER)) != -1) {
                out.write(data, 0, count);
            }
            origin.close();
        }
    }
}

  public String getLastPathComponent(String filePath) {
    String[] segments = filePath.split("/");
    if (segments.length == 0)
        return "";
    String lastPathComponent = segments[segments.length - 1];
    return lastPathComponent;
}
...