我的问题是这样的:我正在使用 aWatchService来获取有关特定文件夹中新文件的通知,现在如果在所述文件夹中移动/复制或创建文件,则会触发事件并返回新文件的名称。现在的问题是,如果我尝试访问该文件并且该文件尚未完全存在(例如复制仍在进行中),则会引发异常。我尝试做的是这样的事情:
RandomAccessFile raf = new RandomAccessFile(fileName, "rw");
FileChannel fc = raf.getChannel();
FileLock lck = fc.lock();
Run Code Online (Sandbox Code Playgroud)
但即使获得了锁,如果我尝试写入文件,有时仍然会引发异常,因为另一个进程仍然有一个打开的句柄。
现在,如何锁定 Java 中的文件以实现真正的独占访问?
请考虑以下代码:
public interface A {
public A another();
}
public interface B {
public B another();
}
public interface AB extends A,B {
public AB another();
}
Run Code Online (Sandbox Code Playgroud)
这会导致编译错误AB:
B型和A型不兼容; 两者都定义了另一个(),但具有不相关的返回类型
我已经看到了这个问题,并按照接受的答案中的不兼容性示例 - 即
public interface C {
public void doSomething();
}
public interface D {
public boolean doSomething();
}
public interface CD extends C,D {
}
Run Code Online (Sandbox Code Playgroud)
但是,在这种情况下,返回类型实际上是不兼容的 - 返回类型不能同时为void和布尔值.然而,在上面的示例中,another()返回类型AB是a A和a B,因此可以实现两个扩展接口.
此外,看过JLS(8.4.8,8.4.8.3,8.4.8.4)后,我不太明白为什么我的上面的例子非法.任何人都可以向我解释这个吗?
其次,是否有任何解决方案/解决方法,此除重复的合同要求A或B在AB?
我有独立的应用程序,它捆绑在可执行文件中jar。在可执行文件的 MANIFEST 文件中jar,有一个类路径条目,其中jar列出了所有依赖项(包括所有 logback 实现 jar )。该可执行 jar 还包含logback.xml文件。
通过这种结构,当我使用简单的命令运行应用程序时java -jar MyApplication.jar,应用程序可以通过正确的日志记录正常运行。但这里的主要问题是,要更改日志级别,需要打开 jar 文件,而我不能要求客户端这样做。所以我放在logback.xmljar 之外,但现在所有日志记录都发生在控制台上。
我提到Logback 无法找到 logback.xml,即使它存在(在类路径上),并且提到的解决方案是将 logback.xml 捆绑在一个单独的 jar 中。但这个解决方案很糟糕。这样客户端就无法轻易更改日志级别。如何使其与 jar 外部的 logback.xml 一起使用。
我尝试添加logback.xmlMANIFEST 类路径条目以及其他依赖 jar 的条目,但没有成功。我的应用程序结构如下
+RootFolder
--MyApplication.jar
--logback-classic-1.1.3.jar
--logback-core-1.1.3.jar
--slf4j-api-1.7.7.jar
--Other-Dependency.jar
--logback .xml
有人已经解决这个问题了吗?我不想通过配置器使用编程配置。目前的解决方法是使用 option-Dlogback.configurationFile=logback.xml但如何使其在没有 out 的情况下工作?
JSplitPane似乎添加了任何Component添加到它的边框.
嵌套的JSplitPanes最明显 - 例如:
public class JSplitPaneToy {
public static void main(String[] args) {
JSplitPane sp = new JSplitPane(JSplitPane.VERTICAL_SPLIT,
makePanel(), makePanel());
sp = new JSplitPane(JSplitPane.VERTICAL_SPLIT, makePanel(), sp);
sp = new JSplitPane(JSplitPane.VERTICAL_SPLIT, makePanel(), sp);
sp = new JSplitPane(JSplitPane.VERTICAL_SPLIT, makePanel(), sp);
JFrame frame = new JFrame("JSplitPane Toy");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setContentPane(sp);
frame.pack();
frame.setVisible(true);
}
private static JScrollPane makePanel() {
JScrollPane pane = new JScrollPane(new JTable(
new Object[][]{{0, 1, 2}, {1, 2, 3}, {2, 3, 4}}, new Object[]{1, 2, 3}));
pane.setPreferredSize(new Dimension(200, …Run Code Online (Sandbox Code Playgroud) 我有一个抽象类,抽象方法,我想要的参数final- 也就是说,我不想允许抽象类和方法的实现重新分配参数.
编辑:这个动机本身并不是不变性,这更多地与对象的设计有关.(事实上,在我的用例中,参数是将在抽象方法的实现中进行变异的集合.)相反,我想与实现我的抽象类/方法的任何人沟通,不应该重新分配这些变量.我知道我可以通过java-doc进行沟通,但我正在寻找更合同的东西 - 他们必须遵循,而不是仅仅被引导跟随.
在非抽象方法中,我可以使用final关键字来执行此操作- 例如:
public class MyClazz {
public void doSomething(final int finalParameter){
finalParameter++; // compile error - cannot assign a value to final variable
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我final在抽象方法中使用关键字,则这不构成合同的一部分 - 也就是说,抽象方法的实现不需要final关键字,并且可以重新分配参数:
public abstract class MyAbstractClazz {
public abstract void doSomething(final int finalVariable);
}
public class MyExtendedClazz extends MyAbstractClazz {
@Override
public void doSomething(int finalVariable) { // does not require final keyword
finalVariable++; // so the variable is modifiable
}
} …Run Code Online (Sandbox Code Playgroud) 我有一个大小为 1000 的数组。我想使用流操作来执行如下操作:-
List list= new ArrayList();
//list is initialize to 1000 elements
List subList = list.subList(0, 100);
// perform some operaions over the subarray
List subList1 = list.subList(101, 200);
// perform some operaions over the subarray
.... so on
}
Run Code Online (Sandbox Code Playgroud)
我想要使用流 API 的代码。提前致谢
我正在使用 hggit 将我们的 mercurial 存储库导出到 git。我正在关注这里的教程:http : //arr.gr/blog/2011/10/bitbucket-converting-hg-repositories-to-git/ 但是这会错过所有未合并到默认值的分支。我想这是因为单个书签(hg bookmark -r default master)。我是否需要分别为每个开放的分支添加书签?hggit 能否以某种方式选择所有打开的分支(因为我们可能有很多分支)?
我正在为接口的实现编写测试类,并希望针对另一个实现测试我的实现(即确保一致性).然后测试方法将测试每个接口方法以检查这一点.
要做到这一点,我可以:
a)创建private static原始实现的常量字段和我的新实现:
public class MyImplTest extends TestCase {
private static OldImpl _original;
private static MyImpl _myImpl;
static {
// instantiate _original and _myImpl
}
// My tests
}
Run Code Online (Sandbox Code Playgroud)
b)创建private两个实现的字段,并使用setUp()以下方法实例化它们:
public class MyImplTest extends TestCase {
private OldImpl _original;
private MyImpl _myImpl;
public void setUp(){
// instantiate _original and _myImpl
}
// My tests
}
Run Code Online (Sandbox Code Playgroud)
是这些首选/被认为是好的风格?我的直觉建议(B),但我想创造相当大的物体,并setUp()获取运行每个testSomething()的方法TestCase,这样既_original和_myImpl将被创建多次.
FWIW,我正在使用JUnit 3.
我希望通过char比较使用char来断言文件.最好的方法是什么?没有第三方库.哪个文件阅读器最适合这个?
我希望能够在Java中更改1970年到2008年的基本毫秒参考,这样我就可以节省数据库中的空间和唯一的ID.
最好是Joda-Time.
所谓的Java 7版本中即将推出的jsr-310实现了它.
在此链接的"离散时间轴"部分中,它指出毫秒的计数已从1970年改为2008年
http://today.java.net/pub/a/today/2008/09/18/jsr-310-new-java-date-time-api.html
我能看到的唯一其他选项是每次需要查找记录时以数学方式实现它.
例如
DateTime dt = new DateTime();
long now = dt.getMillis();
DateTime dt2 = new DateTime(2008, 1, 1, 0, 0, 0, 0);
long then = dt2.getMillis();
long smallerDate = now - then;
Run Code Online (Sandbox Code Playgroud)
较小的日期将存储在DB中
- 编辑 -
所以我误读了JSR-310,这是不可能的.
有更好的方法来节省空间,然后处理成千上万的请求计算多头的头痛.
我想将长记录为日期,因为我永远不会知道将数据库移动到哪里,也许MySQL => Oracle.
所以我不想要时间戳,我只想要BigInts.
有很多SO问题涉及计算Java中两个日期或两个日期之间的差异.许多答案指出了核心Java Date类的问题,并建议使用Jodatime,但AFAIK,没有任何建议使用jsr310如何做到这一点.
那么,有什么方法可以在jsr310中计算两个日期或两个日期之间的差异吗?
作为参考,以下问题可以解决此问题:
在核心Java中:
在Jodatime:
java ×9
datetime ×2
jsr310 ×2
abstract ×1
arrays ×1
border ×1
date ×1
equals ×1
file ×1
file-locking ×1
final ×1
git ×1
hg-git ×1
interface ×1
java-7 ×1
java-8 ×1
java-stream ×1
jls ×1
jodatime ×1
jsplitpane ×1
junit ×1
list ×1
locking ×1
logback ×1
logging ×1
mercurial ×1
overriding ×1
performance ×1
swing ×1
unit-testing ×1