All Downloads are FREE. Search and download functionalities are using the official Maven repository.

jetbrains.exodus.vfs.File Maven / Gradle / Ivy

There is a newer version: 9.8.0.76914
Show newest version
/**
 * Copyright 2010 - 2022 JetBrains s.r.o.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package jetbrains.exodus.vfs;

import jetbrains.exodus.ArrayByteIterable;
import jetbrains.exodus.ByteIterable;
import jetbrains.exodus.ByteIterator;
import jetbrains.exodus.bindings.LongBinding;
import jetbrains.exodus.env.Transaction;
import jetbrains.exodus.util.LightOutputStream;
import org.jetbrains.annotations.NotNull;

import java.io.OutputStream;

/**
 * Describes a file of a {@linkplain VirtualFileSystem}. {@code File} is identified by its {@linkplain #getPath()}.
 * Path is an abstract string, it can be used to codify a hierarchy, though {@linkplain VirtualFileSystem} doesn't
 * contain methods to enumerate files by a path prefix.
 *
 * 

In addition, {@code File} can be identified by a file descriptor which an internal {@linkplain VirtualFileSystem} * {@code long} unique id. Identifying by file descriptor allows to * {@linkplain VirtualFileSystem#renameFile(Transaction, File, String) rename} a file. * *

{@code File} has its {@linkplain #getCreated() created} and {@linkplain #getLastModified() last modified} time. * * @see VirtualFileSystem * @see VirtualFileSystem#createFile(Transaction, String) * @see VirtualFileSystem#openFile(Transaction, String, boolean) */ public class File { @NotNull private final String path; private final long fd; private final long created; private final long lastModified; File(@NotNull final String path, final long fd, final long created, final long lastModified) { this.path = path; this.fd = fd; this.created = created; this.lastModified = lastModified; } File(@NotNull final File origin) { this(origin.path, origin.fd, origin.created, System.currentTimeMillis()); } File(@NotNull final String path, @NotNull final ByteIterable iterable) { this.path = path; final ByteIterator iterator = iterable.iterator(); fd = LongBinding.readCompressed(iterator); created = LongBinding.readCompressed(iterator); lastModified = LongBinding.readCompressed(iterator); } /** * Returns the path which the {@code File} is identified by. Path is an abstract string, it can be used to codify * a hierarchy, though {@linkplain VirtualFileSystem} doesn't contain methods to enumerate files by a path prefix. * * @return path of the {@code File} */ @NotNull public String getPath() { return path; } /** * @return the {@code File}'s internal unique id */ public long getDescriptor() { return fd; } /** * Returns the time when the {@code File} was created. This value never changes. * * @return the time when the {@code File} was created * @see VirtualFileSystem#createFile(Transaction, String) * @see VirtualFileSystem#createFile(Transaction, long, String) * @see VirtualFileSystem#openFile(Transaction, String, boolean) */ public long getCreated() { return created; } /** * Returns the time when the {@code File} was modified last time or explicitly touched. * {@linkplain VirtualFileSystem}'s methods that open {@linkplain OutputStream} by file descriptor, not * {@linkplain File} instance, return the stream which doesn't update last modified time. * *

The returned value is actual to the moment of the {@code File} instance creation, * {@linkplain VirtualFileSystem#openFile(Transaction, String, boolean) open} new {@code File} instance to get * consistent value of last modified time. * * @return the time when the {@code File} was modified last time or explicitly touched * @see VirtualFileSystem#touchFile(Transaction, File) */ public long getLastModified() { return lastModified; } @Override public String toString() { return path + "[fd = " + fd + ']'; } ArrayByteIterable toByteIterable() { final LightOutputStream output = new LightOutputStream(); final int[] bytes = new int[8]; LongBinding.writeCompressed(output, fd, bytes); LongBinding.writeCompressed(output, created, bytes); LongBinding.writeCompressed(output, lastModified, bytes); return output.asArrayByteIterable(); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy