Захватите сегмент массива в Java, не создавая новый массив на "куче"

Существует два ключевых подхода, и оба оказывают значительное влияние на дизайн системы, такой, что не легко переместиться от одного до другого без значительной перезаписи. Необходимо понять то, что прежде выбирает политика управления безопасностью компаний.

1) у Каждого пользователя есть учетные данные, которые несут через приложение для сервиса, который используется Приложением; в Вашем случае база данных Oracle использует те удостоверения пользователя для соединения с базой данных. Оборотная сторона - то, что каждому пользователю нужны учетные данные для каждого безопасного сервиса. Это - разумный безопасный подход, но также и требует, чтобы signficant дополнительная работа предоставила и поддержала удостоверения пользователя. Ваши администраторы базы данных должны будут активно управлять удостоверениями пользователя, которые могут работать в противоречии с Вашими company’s политиками управления безопасностью.

2) учетные данные базы данных Application хранятся на безопасной службе каталогов, например, Защищают LDAP. Доступы к приложению служба каталогов с users’ учетными данными. Служба каталогов возвращает approriate учетные данные для получаемого доступ сервиса.

В обоих случаях учетные данные базы данных должны быть ограничены для выполнения соответствующих операций только. Учетные данные должны отразить требования бизнес-процессов, например; они позволяют выбор из определенных представлений/таблиц, вставляют в других, но не создают, обновляют или отбрасывают таблицы. Во втором использовании подхода отдельные учетные данные для каждого основного бизнес-процесса, например, Обработки заказов, Учета, HR, и т.д.

Однако помнят, что безопасность похожа на слои луковицы, если кто-то снял слои для доступа к приложению, такому, что они могут получить доступ к DB contection файл конфигурации пула. Они могут, вероятно, троянец приложение для получения users’ учетных данных. Это - то, где хорошая политика управления безопасностью входит.

Управление безопасностью является сложным вопросом, которому нужно обязательство высшего руководства, потому что при необходимости в этом уровне безопасности для живой платформы это стоит. Необходимо разделить обязанности разработки от развертывания, операций & управление полномочиями пользователей. Вы, возможно, также должны иметь аудиторов безопасности, у которых есть полный доступ для просмотра изменений, но никакой способности изменить конфигурацию. Это, если совсем не простой и высокооплачиваемый specialism.

180
задан Ciro Santilli 新疆改造中心法轮功六四事件 18 March 2015 в 20:56
поделиться

9 ответов

Заявление об ограничении ответственности: этот ответ не соответствует ограничениям вопроса:

Я не хочу создавать новый массив байтов в памяти кучи только для этого.

( Честно говоря, я считаю, что мой ответ заслуживает удаления. Ответ @ unique72 правильный. Я оставлю это редактирование ненадолго, а затем я удалю этот ответ. )


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

Тем не менее, если кто-то ищет краткости, служебный метод Arrays.copyOfRange () был представлен в Java 6 (конец 2006 г.?):

byte [] a = new byte [] {0, 1, 2, 3, 4, 5, 6, 7};

// get a[4], a[5]

byte [] subArray = Arrays.copyOfRange(a, 4, 6);
184
ответ дан 23 November 2019 в 06:11
поделиться

The Lists allow you to use and work with subList of something transparently. Primitive arrays would require you to keep track of some kind of offset - limit. ByteBuffers have similar options as I heard.

Edit: If you are in charge of the useful method, you could just define it with bounds (as done in many array related methods in java itself:

doUseful(byte[] arr, int start, int len) {
    // implementation here
}
doUseful(byte[] arr) {
    doUseful(arr, 0, arr.length);
}

It's not clear, however, if you work on the array elements themselves, e.g. you compute something and write back the result?

6
ответ дан 23 November 2019 в 06:11
поделиться

Ссылки Java всегда указывают на объект. У объекта есть заголовок, который, помимо прочего, идентифицирует конкретный тип (поэтому приведение может завершиться ошибкой ClassCastException ). Для массивов начало объекта также включает длину, данные затем следуют сразу после в памяти (технически реализация может делать то, что ей заблагорассудится, но было бы глупо делать что-то еще). Таким образом, у вас не может быть ссылки, которая указывает где-нибудь в массиве.

В C указатели указывают где угодно и на что угодно, и вы можете указать на середину массива. Но вы не можете безопасно преобразовать или узнать длину массива. В D указатель содержит смещение в блоке памяти и длину (или, что то же самое, указатель на конец, я не могу вспомнить, что на самом деле делает реализация). Это позволяет D разрезать массивы. В C ++ у вас будет два итератора, указывающих на начало и конец, но C ++ немного странный в этом плане.

Итак, возвращаясь к Java, нет, вы не можете. Как уже упоминалось, NIO ByteBuffer позволяет вам обернуть массив и затем разрезать его, но дает неудобный интерфейс. Вы, конечно, можете копировать, что, вероятно, намного быстрее, чем вы думаете. Вы можете ввести свою собственную String -подобную абстракцию, которая позволяет вам разрезать массив (текущая реализация Sun String имеет ссылку char [] плюс начало смещение и длина, более высокопроизводительная реализация имеет просто char [] ). byte [] - это низкий уровень, но любая абстракция на основе классов, которую вы добавляете, приведет к ужасному беспорядку в синтаксисе до JDK7 (возможно).

Итак, возвращаясь к Java, нет, вы не можете. Как уже упоминалось, NIO ByteBuffer позволяет вам обернуть массив и затем разрезать его, но дает неудобный интерфейс. Вы, конечно, можете копировать, что, вероятно, намного быстрее, чем вы думаете. Вы можете ввести свою собственную String -подобную абстракцию, которая позволяет вам разрезать массив (текущая реализация Sun String имеет ссылку char [] плюс начало смещение и длина, более высокопроизводительная реализация имеет просто char [] ). byte [] - это низкий уровень, но любая абстракция на основе классов, которую вы добавляете, приведет к ужасному беспорядку в синтаксисе до JDK7 (возможно).

Итак, возвращаясь к Java, нет, вы не можете. Как уже упоминалось, NIO ByteBuffer позволяет вам обернуть массив и затем разрезать его, но дает неудобный интерфейс. Вы, конечно, можете копировать, что, вероятно, намного быстрее, чем вы думаете. Вы можете ввести свою собственную String -подобную абстракцию, которая позволяет вам разрезать массив (текущая реализация Sun String имеет ссылку char [] плюс начало смещение и длина, более высокопроизводительная реализация имеет просто char [] ). byte [] - это низкий уровень, но любая абстракция на основе классов, которую вы добавляете, приведет к ужасному беспорядку в синтаксисе до JDK7 (возможно).

NIO ByteBuffer позволяет вам обернуть массив и затем разрезать его, но дает неудобный интерфейс. Вы, конечно, можете копировать, что, вероятно, намного быстрее, чем вы думаете. Вы можете ввести свою собственную String -подобную абстракцию, которая позволяет вам разрезать массив (текущая реализация Sun String имеет ссылку char [] плюс начало смещение и длина, более высокопроизводительная реализация имеет просто char [] ). byte [] - это низкий уровень, но любая абстракция на основе классов, которую вы добавляете, приведет к ужасному беспорядку в синтаксисе до JDK7 (возможно).

NIO ByteBuffer позволяет вам обернуть массив и затем разрезать его, но дает неудобный интерфейс. Вы, конечно, можете копировать, что, вероятно, намного быстрее, чем вы думаете. Вы можете ввести свою собственную String -подобную абстракцию, которая позволяет вам разрезать массив (текущая реализация Sun String имеет ссылку char [] плюс начало смещение и длина, более высокопроизводительная реализация имеет просто char [] ). byte [] - это низкий уровень, но любая абстракция на основе классов, которую вы добавляете, приведет к ужасному беспорядку в синтаксисе до JDK7 (возможно).

Вы можете ввести свою собственную String -подобную абстракцию, которая позволяет вам разрезать массив (текущая реализация Sun String имеет ссылку char [] плюс начало смещение и длина, более высокопроизводительная реализация имеет просто char [] ). byte [] - это низкий уровень, но любая абстракция на основе классов, которую вы добавляете, приведет к ужасному беспорядку в синтаксисе до JDK7 (возможно).

Вы можете ввести свою собственную String -подобную абстракцию, которая позволяет вам разрезать массив (текущая реализация Sun String имеет ссылку char [] плюс начало смещение и длина, более высокопроизводительная реализация имеет просто char [] ). byte [] - это низкий уровень, но любая абстракция на основе классов, которую вы добавляете, приведет к ужасному беспорядку в синтаксисе до JDK7 (возможно).

6
ответ дан 23 November 2019 в 06:11
поделиться

One option would be to pass the whole array and the start and end indices, and iterate between those instead of iterating over the whole array passed.

void method1(byte[] array) {
    method2(array,4,5);
}
void method2(byte[] smallarray,int start,int end) {
    for ( int i = start; i <= end; i++ ) {
        ....
    }
}
7
ответ дан 23 November 2019 в 06:11
поделиться

Используйте java.nio.Buffer's. Это легкая оболочка для буферов различных примитивных типов, помогающая управлять нарезкой, положением, преобразованием, порядком байтов и т. Д.

Если ваши байты происходят из потока, буферы NIO могут использовать «прямой режим», который создает буфер, поддерживаемый родные ресурсы. Это может улучшить производительность во многих случаях.

20
ответ дан 23 November 2019 в 06:11
поделиться

I see the subList answer is already here, but here's code that demonstrates that it's a true sublist, not a copy:

public class SubListTest extends TestCase {
    public void testSubarray() throws Exception {
        Integer[] array = {1, 2, 3, 4, 5};
        List<Integer> list = Arrays.asList(array);
        List<Integer> subList = list.subList(2, 4);
        assertEquals(2, subList.size());
        assertEquals((Integer) 3, subList.get(0));
        list.set(2, 7);
        assertEquals((Integer) 7, subList.get(0));
    }
}

I don't believe there's a good way to do this directly with arrays, however.

10
ответ дан 23 November 2019 в 06:11
поделиться

You could use the ArrayUtils.subarray in apache commons. Not perfect but a bit more intuitive than System.arraycopy. The downside is that it does introduce another dependency into your code.

14
ответ дан 23 November 2019 в 06:11
поделиться

Если вы ищете подход с псевдонимом в стиле указателя, чтобы вам даже не нужно было выделять место и копировать данные, то я считаю, что вам не повезло.

Система .arraycopy () будет копировать из вашего источника в место назначения, и для этой утилиты заявлена ​​эффективность. Вам необходимо выделить целевой массив.

39
ответ дан 23 November 2019 в 06:11
поделиться
List.subList(int startIndex, int endIndex)
9
ответ дан 23 November 2019 в 06:11
поделиться
Другие вопросы по тегам:

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